如果传递给带注释函数的参数类型与指定的参数不匹配,是否可能产生python throw错误?

Ily*_*rov 11 python type-hinting python-3.5

python3.5的一个新功能是类型提示.例如,以下代码现在有效:

def greeting(name: str) -> str:
    return 'Hello ' + name
Run Code Online (Sandbox Code Playgroud)

但是,正如我所理解的那样,它不会自行检查任何内容,并且解释方式与此完全相同:

def greeting(name):
    return 'Hello ' + name
Run Code Online (Sandbox Code Playgroud)

并且主要用于帮助静态分析器(并使代码更容易理解).但是当将无效类型的参数传递给具有带注释的参数类型的函数时,是否存在(或计划在将来实施)以任何方式(可能通过使用某些第三方库)来发出python throw错误(仅使用类型提示语法)?

Joh*_*man 9

类型提示实现PEP 0484,它显式列出为非目标

尽管建议的类型模块将包含一些用于运行时类型检查的构造块-尤其是get_type_hints()函数-但必须开发第三方程序包以实现特定的运行时类型检查功能,例如使用装饰器或元类。使用类型提示进行性能优化留给读者练习。

由此看来,Python开发人员没有计划添加您想要的功能。引用中提到了装饰器,这似乎是可行的方法。在概念上似乎很简单-装饰器会使用get_type_hints()在要装饰的函数上进行迭代,并遍历参数,针对任何提示检查其类型,如果发生冲突则抛出错误,或者仅将参数传递给函数。这与pzelasko的答案类似,但装饰器使用提示来自动处理样板代码。最简单的方法是简单地审核参数,尽管您还应该能够创建一个装饰器,如果返回类型与提示冲突,该装饰器将引发错误。我还没有Python 3.5,也没有时间去追求它-但是对于想要同时了解装饰器和类型提示的人来说,这似乎是一个不错的学习练习。也许您可以成为PEP所暗示的“第三方”之一。


Vin*_*t J 6

如果使用Python3.6注解,可以使用typeguard装饰器: https://typeguard.readthedocs.io/en/latest/userguide.html#using-the-decorator

注意:这应该只是一种“调试”或“测试”工具,而不是生产工具。因此,他们建议向 python 添加 -O 选项,以便在生产中无需运行。

它不会自动检查内联变量注释,只会检查函数参数、函数返回和对象类型。

来自文档:

from typeguard import typechecked

@typechecked
def some_function(a: int, b: float, c: str, *args: str) -> bool:
    ...
    return retval

@typechecked
class SomeClass:
    # All type annotated methods (including static and class methods and properties)
    # are type checked.
    # Does not apply to inner classes!
    def method(x: int) -> int:
        ...
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令将所有功能自动化:

with install_import_hook('myapp'):
    from myapp import some_module
Run Code Online (Sandbox Code Playgroud)