我可以简化从 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)
注意,在运行时,这只是 returns 它的参数,即 str
,它仅用于静态类型检查。
我从 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)
注意,在运行时,这只是 returns 它的参数,即 str
,它仅用于静态类型检查。