在pycon中引用本地类型

2024-05-13 19:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在web应用程序中使用PyContracts,因此我有很多自定义的类被传递,我只想在其他更传统的参数类型中进行类型检查。我想使用契约式编程(PyContracts)来实现这一点,为了保持整洁和强制文档化。在

当我按名称引用一个本地可见的类时,PyContracts似乎不知道该类型。例如:

from contracts import contract

class SomeClass:
    pass

@contract
def f(a):
    """

    :param a: Just a parameter
    :type a: SomeClass
    """
    print(a)

my_a = SomeClass()
f(my_a)

引发以下错误:

^{pr2}$

我知道我可以使用new_contract来自定义名称并将它们绑定到类,但对于每种类型,这都是一个很大的麻烦。如果可能的话,我想对PyContracts使用docstring语法,而且我肯定需要使用字符串定义的契约格式,因为我使用的是布尔类型逻辑("None|str|SomeClass")。如何使用本地类型和对代码库其余部分的最小入侵来实现这一点?在


Tags: from文档名称web应用程序类型参数定义
1条回答
网友
1楼 · 发布于 2024-05-13 19:12:48

我设计了一个魔术装饰器,在创建合同之前添加了类型。对于任何感兴趣的人来说,这似乎是可行的,但如果定义大量函数,则可能会相当慢:

def magic_contract(*args, **kwargs):
    # Check if we got called without arguments, just the function
    func = None
    if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
        func = args[0]
        args = tuple()

    def inner_decorator(f):
        for name, val in f.__globals__.items():
            if isinstance(val, type):
                new_contract(name, val)
        return contract(*args, **kwargs)(f)

    if func:
        return inner_decorator(func)
    return inner_decorator

一些测试运行:

^{pr2}$

相关问题 更多 >