Python 是否可以创建正则表达式约束类型提示?

Python 是否可以创建正则表达式约束类型提示?,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,我有一个帮助函数,可以将%Y-%m-%d%H:%m:%S格式的字符串转换为日期时间。日期时间: def ymdt_to_datetime(ymdt: str) -> datetime.datetime: return datetime.datetime.strptime(ymdt, '%Y-%m-%d %H:%M:%S') 我可以在函数本身中验证ymdt格式,但是使用自定义对象作为参数的类型提示会更有用,比如 from typing import NewType, Pattern

我有一个帮助函数,可以将
%Y-%m-%d%H:%m:%S
格式的字符串转换为
日期时间。日期时间

def ymdt_to_datetime(ymdt: str) -> datetime.datetime:
    return datetime.datetime.strptime(ymdt, '%Y-%m-%d %H:%M:%S')
我可以在函数本身中验证
ymdt
格式,但是使用自定义对象作为参数的类型提示会更有用,比如

from typing import NewType, Pattern

ymdt_pattern = '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]'
YmdString = NewType('YmdString', Pattern[ymdt_pattern])

def ymdt_to_datetime(ymdt: YmdString)...

我走错兔子洞了吗?这应该是
mypy
或其他地方的问题吗?或者这可以通过当前的类型提示实现(3.61)来实现吗?

使用类型提示在Python中不起任何作用,在静态检查器中充当类型指示。它并不意味着执行任何操作,只是注释一个类型


您不能进行任何验证,您所能做的就是使用类型提示和检查程序,确保传入的参数实际上是
str
类型

不幸的是,类型目前无法静态验证字符串是否与精确格式匹配。这部分是因为在编译时检查给定变量可以持有的确切值非常难以实现(事实上,在某些情况下是NP难的),部分是因为在用户输入等情况下,问题变得不可能解决。因此,在不久的将来,这个特性不太可能被添加到mypy或Python类型生态系统中(如果有的话)

一个潜在的解决方法是利用
NewType
,并仔细控制何时构造该格式的字符串。也就是说,你可以做:

from typing import NewType
YmdString = NewType('YmdString', str)

def datetime_to_ymd(d: datetime) -> YmdString:
    # Do conversion here
    return YmdStr(s)

def verify_is_ymd(s: str) -> YmdString:
    # Runtime validation checks here
    return YmdString(s)

如果您仅使用类似的函数来引入类型为
YmdString
的值,并进行测试以确认“构造函数”工作正常,那么您可以在编译时或多或少安全地区分字符串和
YmdString
。然后,您可能希望将程序设计为尽量减少调用这些函数的频率,以避免产生不必要的开销,但希望这样做不会太繁重。

谢谢,Jim。我不想执行任何操作,只是想知道是否可以为检查器创建自定义类型(一种非常特定的格式的
str
),以进行检查。@ZevAverbach我明白了。不,不能检查字符串的外观,只能检查其类型。所做的检查是基于类型的,因此无论
str
对象是什么样子,它仍然是
str
对象。谢谢,@Michael。你是想打电话给
verify\u is_ymd
datetime\u的某个地方,还是我没听清你的意思?@ZevAverbach--你可以,但没有必要。如果仔细测试
datetime\u to_ymd
到您非常确信它是正确的,那么您可以完全忽略运行时检查。(也就是说,不是通过类型系统或运行时检查获得对
datetime\u to_ymd
的信心,而是通过单元测试获得信心)。相反,您的其他代码将调用这两个函数之一(或您编写的其他“构造函数”)。当然,如果单元测试还不足以让您确信正确性,那么您可以在
datetime\u中调用验证函数,不管怎样,都可以将其调用到\u ymd