Python函数参数作为内省字符串
我目前正在建立一个个人调试函数库,并希望制作一个调试打印函数,该函数将提供比到处添加Python函数参数作为内省字符串,python,introspection,Python,Introspection,我目前正在建立一个个人调试函数库,并希望制作一个调试打印函数,该函数将提供比到处添加print(thing)行更高质量的功能。我当前的目标是将此伪代码函数转换为Python: def p(*args, **kwargs) for arg in args: print(uneval(arg), ": ", arg) return args **kwargs的类型以及它们如何影响输出对于这个问题来说并不重要,因此我为什么不在这里使用它们 我的主要问题来自于尝试使用一
print(thing)
行更高质量的功能。我当前的目标是将此伪代码函数转换为Python:
def p(*args, **kwargs)
for arg in args:
print(uneval(arg), ": ", arg)
return args
**kwargs的类型以及它们如何影响输出对于这个问题来说并不重要,因此我为什么不在这里使用它们
我的主要问题来自于尝试使用一些uneval
-ing参数的方法,这样我就可以得到实际生成参数的代码字符串。作为一个用例:
>>> p(3 + 5) + 1
3 + 5: 8 # printed by p
9 # Return value of the entire expression
我认为有两种方法可以做到这一点,我不仅不确定其中任何一种是否有效,我还担心任何实际实现这些的解决方案可能会有多大的Pythonic
将参数作为字符串传递,eval
it使用上一个上下文的本地标识符字典(如果不将其作为另一个参数传递,我怎么能得到它,这是我绝对不想做的?)
找出从.py文件中的哪一行运行它来提取uneval
'd字符串(这可能吗?)
找到一些元数据魔术,其中已经包含我需要的信息(如果存在的话,最好也不太可能)
您可以使用decorator,该decorator将使用ast
模块来解析修饰后的函数,并从生成的语法树中获得“uneval”函数……听起来您想要更改求值顺序。毕竟,示例中p的参数不是“3+5”。如果没有源代码/令牌级别的操作,您不可能做到这一点,实际上您需要的是类似于宏的东西。这是可行的,但很难想象任何解决方案会被称为“pythonic”。这只是一种纯粹的魔法。在这里再仔细检查一下,uneval
是你想要得到的东西,而不是存在的东西,我还没有听说过?嗯,是的,我不认为有一种特别简单的方法可以在运行时做到这一点,而无需插入代码或将自己插入导入的内部(我想这就是一些宏包所做的)。这似乎是一件麻烦的事,而且对于一个稍微好一点的调试printf来说是一件非常麻烦的事。@StevenHewitt:事实上,decorator应该在p
;如果我有时间我会尝试回答;但我不确定我是否100%理解你的问题;)你可以使用decorator,这将使用ast
模块解析修饰后的函数,从生成的语法树中,您可以得到“uneval”函数……听起来您想更改求值顺序。毕竟,示例中p的参数不是“3+5”。如果没有源代码/令牌级别的操作,您不可能做到这一点,实际上您需要的是类似于宏的东西。这是可行的,但很难想象任何解决方案会被称为“pythonic”。这只是一种纯粹的魔法。在这里再仔细检查一下,uneval
是你想要得到的东西,而不是存在的东西,我还没有听说过?嗯,是的,我不认为有一种特别简单的方法可以在运行时做到这一点,而无需插入代码或将自己插入导入的内部(我认为一些宏包就是这样做的)。这似乎是一个麻烦,而且对于一个稍微好一点的调试printf来说是一个极大的干扰。@StevenHewitt:实际上,装饰师应该在p
附近;如果我有时间,我会尝试回答;但我不确定我100%理解你的问题;)