题
我没有真的付出多少注意到蟒蛇3的发展作为我会喜欢,而只是注意到一些有趣的新的语法的变化。具体地说从 这样的回答 功能参数的注释:
def digits(x:'nonnegative number') -> "yields number's digits":
# ...
不知道任何关于这一点,我认为它也许可以用于执行静态输入蟒蛇!
后一搜索,似乎有很多的讨论关于(完全可选)的静态输入蟒蛇,比如,提到在 PEP3107, , "加入任择静打字蟒" (及 第2部分)
..但是,我不清楚如何止这一已经取得了进展。是否有任何实现的静态型,利用参数标?没有任何的参数化型的想法,使它成为蟒蛇3?
解决方案
感谢您阅读我的代码!
事实上,不难在Python中创建一个通用的注释实施者。这是我的看法:
'''Very simple enforcer of type annotations.
This toy super-decorator can decorate all functions in a given module that have
annotations so that the type of input and output is enforced; an AssertionError is
raised on mismatch.
This module also has a test function func() which should fail and logging facility
log which defaults to print.
Since this is a test module, I cut corners by only checking *keyword* arguments.
'''
import sys
log = print
def func(x:'int' = 0) -> 'str':
'''An example function that fails type checking.'''
return x
# For simplicity, I only do keyword args.
def check_type(*args):
param, value, assert_type = args
log('Checking {0} = {1} of {2}.'.format(*args))
if not isinstance(value, assert_type):
raise AssertionError(
'Check failed - parameter {0} = {1} not {2}.'
.format(*args))
return value
def decorate_func(func):
def newf(*args, **kwargs):
for k, v in kwargs.items():
check_type(k, v, ann[k])
return check_type('<return_value>', func(*args, **kwargs), ann['return'])
ann = {k: eval(v) for k, v in func.__annotations__.items()}
newf.__doc__ = func.__doc__
newf.__type_checked = True
return newf
def decorate_module(module = '__main__'):
'''Enforces type from annotation for all functions in module.'''
d = sys.modules[module].__dict__
for k, f in d.items():
if getattr(f, '__annotations__', {}) and not getattr(f, '__type_checked', False):
log('Decorated {0!r}.'.format(f.__name__))
d[k] = decorate_func(f)
if __name__ == '__main__':
decorate_module()
# This will raise AssertionError.
func(x = 5)
鉴于这种简单,它是在第一次看到奇怪的是,这个东西不是主流。不过,我相信也有很好的理由为什么它的,因为它看起来不一样有用。一般情况下,类型检查帮助,因为如果添加整数和字典,机会是你做了一些明显的错误(如果你意味着什么合理的,它仍然是好过隐显的)。
但在现实生活中,你经常被编译器,但所看到混合相同的计算机类型的数量明确不同的人型,例如下面的代码片段包含一个明显的错误:
height = 1.75 # Bob's height in meters.
length = len(sys.modules) # Number of modules imported by program.
area = height * length # What's that supposed to mean???
任何人应立即看到一个错误在上面的行提供其知道变量height
和length
的“人型”,即使它看起来计算机的完全合法 int
和float
的乘法。
有更可以了解这个问题可能的解决方案可以说,但执行“计算机类型”显然是一个半解决方案,因此,至少在我看来,它的不是在所有无解<更糟/ EM >。这是同样的原因,系统匈牙利是一个可怕的想法,而应用匈牙利是一个伟大的。还有更多的乔尔斯波斯基的非常详实的 帖子 。
现在如果有人是为了实现某种Python的第三方库的,将自动分配到真实世界的数据的人型,然后小心翼翼地变换型像width * height -> area
和强制执行检查与功能注释,我认为这将是一个类型检查的人真的可以用!
其他提示
由于在PEP所提到的,静态类型检查是起作用的注释可用于可能的应用之一,但他们留给了第三方库来决定该怎么做。也就是说,不会在Python核心的正式实施。
至于第三方实现而言,有一些片段(例如 HTTP:// code.activestate.com/recipes/572161/ ),这似乎做工作得很好。
编辑:
作为一个说明,我想提一提,检查行为是最好检查类型,因此,我认为静态类型检查是没有那么大的一个想法。我的回答上述的目的是回答这个问题,并不是因为我会做类型检查自己以这样的方式。
这是不是一个答案直接的问题,但我发现了一个Python叉,增加了静态类型: mypy- lang.org ,当然一个不能依赖于它,因为它仍然是小的努力,但很有趣。
在Python“静态类型”只能被实现,使得类型检查在运行时完成的,这意味着它减慢了应用。因此,你不希望这样的通用性。相反,你希望你的一些方法,以检查它的输入。这可以用普通轻松完成断言,或装饰,如果你(错误地)认为你需要它了。
有也是静态类型检查的替代,这是用一个方面的面向组件架构等Zope的组件架构。而不是检查的类型,你适应它。因此,而不是:
assert isinstance(theobject, myclass)
你这样做:
theobject = IMyClass(theobject)
如果theobject已经实现IMyClass没有任何反应。如果没有,那包什么theobject是IMyClass适配器会抬头,并用来代替theobject。如果没有找到适配器,你会得到一个错误。
此与具有以特定的方式的特定类型的愿望相结合的Python dynamicism。