我没有真的付出多少注意到蟒蛇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???

任何人应立即看到一个错误在上面的行提供其知道变量heightlength的“人型”,即使它看起来计算机的完全合法 intfloat的乘法。

有更可以了解这个问题可能的解决方案可以说,但执行“计算机类型”显然是一个半解决方案,因此,至少在我看来,它的不是在所有无解<更糟/ 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。

肯定的,静态的打字似乎有点"unpythonic"我不要使用它所有的时间。但在有些情况下(例如嵌套的课程,如在特定领域语言分析),在那里它可以真正加速发展。

然后我更喜欢使用 beartype 解释这个 *.它带有一个混帐回购协议、测试和解释什么可以和什么它不能做...我喜欢的名称;)

*请不要关注塞西尔是夸夸其谈,为什么蟒蛇不附带包括电池在这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top