簡體   English   中英

我可以簡化從 Python 中的字符串類型派生嗎?

[英]Can I simplify deriving from a string type in Python?

我從str派生以獲得強類型的字符串引用。 它們如下所示,是多余的,我想避免冗余:

class VarRef(str):
    def __new__(cls, *args, **kw):
        return str.__new__(cls, *args, **kw)

class SceneRef(str):
    def __new__(cls, *args, **kw):
        return str.__new__(cls, *args, **kw)

class AmbienceRef(str):
    def __new__(cls, *args, **kw):
        return str.__new__(cls, *args, **kw)

例如,這確保了我需要顯式強制轉換來獲取VarRef ,但否則它的功能就像一個字符串。

我還有更多,希望有一種方法可以為每個復制相同的__new__構造函數。

我僅將這些用於 MyPy 類型檢查,因此在運行時如果它們是普通字符串就可以了。 如果有一種機制可以標記它們僅用於類型檢查,我很樂意使用這種方法。

使用NewType聲明一個功能相同但名義上不同於基本類型的類型。

from typing import NewType

URL = NewType("URL", str)
fail: URL = "Hello World"  #  Incompatible types in assignment (expression has type "str", variable has type "URL")
docs: URL = URL("https://docs.python.org/3/library/typing.html")

請記住,對值的操作仍然像往常一樣定義,包括它們的類型。 例如, docs + '#newtype'仍將生成str而不是URL

你,你正在尋找typing.NewType ,所以在這里:

VarRef = typing.NewType("VarRef", str)
SceneRef = typing.NewType("SceneRef", str)
AmbienceRef = typing.NewType("AmbienceRef", str)

注意,在運行時,這只是返回它的參數,即str ,它僅用於 static 類型檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM