首页 > 解决方案 > 一个python函数返回它自己的运行时参数的签名

问题描述

我想要一个功能:

def sig(*args, **kwargs):
    """User-friendly inspect.Signature construction"""
    # I'm guessing some introspection of frames or something...
    pass

这就像它的文档所说的那样:Signature轻松制作实例。

它的行为的一个例子是:

>>> sig(a, b: int, c=1, d: str='bar')
<Signature (a, b: int, c=1, d: str = 'bar')>
>>> sig(something_else)
<Signature (something_else)>
>>> sig()
<Signature ()>

使用该inspect模块的后框架能力似乎有些魔法可以做到,但到目前为止,我只设法想出了丑陋的黑客。

有人有优雅的东西吗?

编辑(〜小时后)

响应者指出,我对简单的渴望在语法上是不可能的。所以我将改写这个问题:什么解决方案可能会接近这种简单性,可能会牺牲一些完整性(例如,没有注释)。

标签: pythonpython-3.xsignatureintrospectioninspect

解决方案


正如@D34DStone 指出的那样,您想要实现的目标是不可能的,因为它不是有效的语法。但是,您可以改为将“规范”作为字符串传递。

这是实现它的一种方法。虽然不是很漂亮......(并且可能不安全)。

def sig(x):
    locals = dict(x=x)
    exec('''
import inspect
def f(%s): pass
s = inspect.signature(f)
    ''' % x, {}, locals)
    return locals['s']

sig("a, b: int, c=1, d: str='bar'")
=> <Signature (a, b:int, c=1, d:str='bar')>

推荐阅读