Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3.5+;_Python_Python 3.x_Duck Typing_Python Typing - Fatal编程技术网

python3.5+;

python3.5+;,python,python-3.x,duck-typing,python-typing,Python,Python 3.x,Duck Typing,Python Typing,该模块在Python 3.5+中实现类型提示。然而,这并不是强制的,它目前似乎只存在于静态类型检查器(如和)中。我希望这将是一个可行的替代方案 问题:有没有一种方法可以在Python 3.7+中启用动态类型检查,而我在Google搜索中没有找到这种方法?例如,如果我定义 def greeting(name: str) -> str: return name 那么在执行时,该操作将失败: greeting([12]) 我不介意为此检查付出时间代价,因为出于我的目的,我必须用ass

该模块在Python 3.5+中实现类型提示。然而,这并不是强制的,它目前似乎只存在于静态类型检查器(如和)中。我希望这将是一个可行的替代方案

问题:有没有一种方法可以在Python 3.7+中启用动态类型检查,而我在Google搜索中没有找到这种方法?例如,如果我定义

def greeting(name: str) -> str:
    return name
那么在执行时,该操作将失败:

greeting([12])
我不介意为此检查付出时间代价,因为出于我的目的,我必须用
assert
语句手工实现它,而且类型提示更简洁、更具描述性

更新:下面的评论员注意到,该包将动态地为我强制执行类型提示。这是一个肯定的答案,它将更新。我已经验证了规范的
typen
示例是否按预期工作:

from typen import enforce_type_hints

@enforce_type_hints
def halve_integer(a: int) -> float:
    return a / 2

halve_integer(5)  # 2.5
halve_integer(5.0)  # ParameterTypeError
唯一的缺点是,每个函数都需要进行修饰以获得行为,而不是只有一个开关来打开所有的功能

更新2:下面的答案也说明了这也解决了问题。这是两个积极的解决方案。然而,
pydantic
似乎更倾向于数据建模,并对其验证装饰器提出了一些强烈的警告:

validate_arguments decorator处于测试版,已添加到 pydantic在v1.5版中临时发布。它可能会发生重大变化 在未来的版本中,它的接口在v2之前不会是具体的。 社区的反馈仍然是暂时的 非常有用;评论#1205或创建新问题


我喜欢线程中给出的答案,因此我将在这里给出:

您可以在Python3中使用注释,这可能会帮助您获得静态类型的一些好处

但是,如果在Python中完全强制使用静态类型,那么它就不再是Python了。这是一种duck类型的动态语言,因此会失去所有的动态性。如果您真的打算使用静态类型语言,最好不要使用Python

并引用PEP 563中的话:

Python将仍然是一种动态类型化的语言,作者不希望强制使用类型提示,即使按照惯例也是如此

就个人而言,有些工具在运行时使用类型注释进行类型检查和验证,因为注释可以通过
\uuuuu annotations\uuuu
属性访问。例如,我在项目中使用的。但它有自己的特点,例如,它在可能的情况下尝试进行隐式类型转换

一些例子:

从pydantic导入validate_参数、ValidationError、BaseModel
... 
... 
... @验证参数
... def sum_foo(a:int,b:int)->int:
...     返回a+b
... 
sum_foo(“你好”,1)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“pydantic/decorator.py”,第25行,在pydantic.decorator.validate_arguments.wrapper_函数中
文件“pydantic/decorator.py”,第107行,在pydantic.decorator.ValidatedFunction.call中
文件“pydantic/main.py”,第346行,位于pydantic.main.BaseModel.\uu init__
pydantic.error_wrappers.ValidationError:SumFoo的1个验证错误
A.
值不是有效的整数(type=type\u error.integer)
类数据(基本模型):
...     a:int=0
...     b:int=1
...     
d=数据(a=0,b=“你好”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“pydantic/main.py”,第346行,位于pydantic.main.BaseModel.\uu init__
pydantic.error\u wrappers.ValidationError:数据的1个验证错误
B
值不是有效的整数(type=type\u error.integer)

我很困惑,duck类型与静态类型不同。Duck类型意味着如果它像鸭子一样嘎嘎叫,那么它就是鸭子。例如,list和str都是iterable,因此在这方面它们可以被认为是相同的(如果您正在寻找iterable)[尽管这更像是goose类型]。你也可以考虑使用一个装饰器或者只在你的代码中做<代码>,如果不是IS实例(名字,STR):……/代码>你可以复制这个包方法Geory,它用否定的方式回答它。不过,在解释器中启用它(比如说添加mypy中某个地方的相同代码)显然是一个胜利,我希望有人已经做到了这一点。这就是问题的重点,所以看看是否有人在那里。事实上,这个问题是由别人提出的,这意味着这不仅仅是我想要的。对于我来说,切换到OCaml或Axiom是不可行的,我想让它在Python中工作。语法悔恨,我必须实现与类型提示相同的效果,但通过在函数参数的类上插入一组assert语句进行动态检查。我认为这是一个鸭子打字的形式。句法懊悔,是的,TypeN似乎是我正在寻找的。我不得不装饰每个函数以获得行为,这很尴尬,但如果它进行我想要的动态检查,我不介意这样做。你能把这个作为一个答案吗?所以这是一种负罪感的快乐,但现在我们知道
typen
pydantic
都以肯定的态度回答这个问题。也许在将来,它们将成为语言的一部分,但无论如何,你将有一个选择
pydantic
似乎比
typen
更不确定。我在上述问题的更新中添加了他们的警告。我喜欢你的答案,但我更倾向于接受
typen
作为最终答案,如果建议它的评论者将其作为答案发布。