我可以简化Python中字符串类型的派生吗?

问题描述 投票:0回答:2

我从

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 类型检查,因此在运行时如果它们是普通字符串就可以了。如果有一种机制可以标记它们仅用于类型检查,我很乐意使用这种方法。

python python-typing mypy
2个回答
1
投票

使用

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


1
投票

你,你正在寻找

typing.NewType
,所以在这里:

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

注意,在运行时,这只是返回其参数,即

str
,它仅用于静态类型检查。

© www.soinside.com 2019 - 2024. All rights reserved.