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%理解你的问题;)