我想要一个python类型提示友好的方式来创建一个具有约束范围的值的类型。
例如,基于str
类型的 URL 类型只接受看起来像“http”URL的字符串。
# this code is made up and will not compile
class URL(typing.NewType('_URL', str)):
def __init__(self, value: str, *args, **kwargs):
if not (value.startswith('http://') or value.startswith('https://')):
raise ValueError('string is not an acceptable URL')
字符串
2条答案
按热度按时间gfttwv5a1#
覆盖内置不可变类型效果良好
覆盖
str
; http URL字符串下面是一个覆盖
str
的例子。这不需要typing
模块,但仍然可以使用类型提示。这个
str
派生类Assert初始化的字符串看起来像一个http URL字符串。字符串
这将导致一个类只允许某些字符串,否则,它的行为就像一个不可变的
str
示例。型
(更新:后来我发现了purl Python库)
另一个例子,
覆盖
int
;限制整数范围Number
这个
int
派生类只允许值1
到9
(包括1
和9
)。这也有一个特殊的功能。如果一个示例被初始化为空(
Number()
),那么这个值就等于0
(这个行为是从int
类派生的)。在这种情况下,__str__
应该是'.'
(程序要求)。型
这确保错误的输入被尽早处理,否则,它的行为就像一个
int
。型
而特别的“功能”
型
overriding
int
; classRomanNumeral
同样的技术可以用来创建一个“罗马数字”类,它接受从0到10的值,写成Roman Numerals。通过重载
__new__
,传递的value
可以与传递给底层int.__new__
和int.__init__
的文字值相关。型
技术inheriting immutable types is derived from this SO answer.
des4xlb02#
内建类型的子类化可能会导致一些奇怪的情况(考虑严格检查
type(...) is str
的代码)这里有一个纯类型的方法,它是类型安全的,并且完全保留了字符串的类型:
字符串
这里的方法将运行时检查“隐藏”在一个函数后面,从API的Angular 来看,这个函数看起来像一个构造函数,但实际上只是一个tiny type(我找不到对“微小类型”的规范引用,这似乎是我能找到的最好的资源)。