python - 一个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
模块的后框架能力似乎有些魔法可以做到,但到目前为止,我只设法想出了丑陋的黑客。
有人有优雅的东西吗?
编辑(〜小时后)
响应者指出,我对简单的渴望在语法上是不可能的。所以我将改写这个问题:什么解决方案可能会接近这种简单性,可能会牺牲一些完整性(例如,没有注释)。
解决方案
正如@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')>
推荐阅读
- android - android 布局问题:按钮未正确显示
- amazon-web-services - 无法使用 SAM 模板为 Lambda 函数创建 S3 PutObjectEvent
- c# - Sendgrid API 返回 Forbidden C#
- react-native - 世博会:找不到变量要求
- c# - 如何使用动态到正常模型?
- linux - 尝试杀死正在运行的python脚本时“没有这样的进程”
- java - org.postgresql.util.PSQLException 在 DefaultLockRegistry#acquire 期间“违反唯一约束”
- url - 从 MS Word 的目录中清除 URL 链接
- java - 截屏并将图像显示到图库中
- haskell - 如何用“反射”包替换 ImplicitParams?