【问题标题】:What are __signature__ and __text_signature__ used for in Python 3.4__signature__ 和 __text_signature__ 在 Python 3.4 中的用途是什么
【发布时间】:2014-11-08 22:04:46
【问题描述】:

如果在 CPython 3.4 上的某些内置可调用对象(类构造函数、方法等)上使用 dir(),会发现其中许多通常具有称为 __text_signature__ 的特殊属性,例如:

>>> object.__text_signature__
'()'
>>> int.__text_signature__
>>> # was None

但是,这方面的文档不存在。此外,在谷歌上搜索属性名称表明还有另一个可能的特殊属性__signature__,尽管我没有找到任何具有它的内置函数。

我确实知道它们与函数参数签名有关,但除此之外,它们的值表示什么以及它们的用途是什么?

【问题讨论】:

    标签: python signature python-3.4 python-internals


    【解决方案1】:

    这些属性用于启用对 C 代码中定义的 Python 对象的自省。 C-API Argument Clinic 提供数据,在构建Signature objects 时协助inspect 模块。以前不支持 C-API 函数的自省。

    请参阅内部 inspect._signature_fromstr() function,了解如何使用 __text_signature__ 值。

    目前,__text_signature__ 属性由 C-API 中对象的内部文档字符串集填充;对 objectname(...)\n--\n\n 进行了简单的文本搜索,其中 \n--\n\n 是 Attribute Clinic 生成的文档字符串的典型。如果您想找到一些示例,请查看type object slots。或者您可以查看audioop module source 以了解 Argument Clinic 如何用于定义签名; Argument Clinic script 在构建时运行以生成文档字符串(在随附的 audioop.c.h file 中)。

    __signature__ 属性(如果存在)将是 inspect.Signature() 对象; C-API 可以提供完全解析的 Signature 实例,而不是提供文本版本。

    【讨论】:

    • 您的回答中有一个严重错误,C-API 被称为 Argument Clinic,引用了同名的 Monty Python 草图;)
    • @Antti:我告诉过你一次
    • 开头还是说“属性诊所”:D
    • @Antti:不,它没有。抱歉,这是 5 分钟的争论还是整整半小时?
    • 哦……只有五分钟。
    【解决方案2】:

    快速总结

    inspect.signature() 函数使用这两个属性来检索有关函数或方法的调用签名的元数据。

    实际应用

    手动指定这些属性之一的一个用例是为使用 *args 的函数提供有用的工具提示。

    在此示例中,randrange() 方法使用*args 接受可变数量的输入。但是,我们希望提供给 help() 的签名和工具提示能够显示每个参数的含义,以便它与对应的 range() 函数匹配。

    import random
    
    class Random(random.Random):
        
        def randrange(self, /, *args):
            'Choose a random value from range(start[, stop[, step]]).'
            return self.choice(range(*args))
    
        randrange.__text_signature__ = '($self, start, stop=None, step=1, /)'
    

    __text_signature__ 属性通知 Signature 对象的创建:

    >>> inspect.signature(Random.randrange)
    <Signature (self, start, stop=None, step=1, /)>
    

    这使得 help() 输出更有用:

    >>> help(Random.randrange)
    Help on function randrange in module __main__:
    
    randrange(self, start, stop=None, step=1, /)
        Choose a random value from range(start[, stop[, step]]).
    

    【讨论】:

      猜你喜欢
      • 2011-03-08
      • 2016-07-05
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2013-02-11
      • 1970-01-01
      相关资源
      最近更新 更多