如何获取Python中函数的输出参数名称?
How to get the names of the output parameters of a function in Python?
我有
def foo(arg1, arg2):
a = 5
b = "hi"
return a, b, "c"
我想要一些 magic(foo)
returns ("a", "b", "un-named")
或类似的东西。
在Python中有类似的东西吗?
编辑:为什么?
创建一个记录器装饰器,为读者提供日志中值的上下文。
使用 inspect.getsourcelines
并尝试查找 return
关键字的可能初始实现。我想可能有很多边界情况会失败,但我们开始吧:
import inspect
def magic(function):
return_lines = list()
for line in inspect.getsourcelines(function)[0]:
line = line.strip()
if line.startswith("return"):
return_lines.append(tuple(line[7:].split(", ")))
return return_lines
>>> magic(foo)
[('a', 'b', '"c"')]
好的,因为 OP 要求我详细说明评论中关于为什么这是一个坏主意以及有哪些替代方案的讨论。
为什么不呢:
一旦你 return 函数中的值,你就不应该再关心它们里面有什么名字了。毕竟,调用什么变量并不重要,重要的是 returned 的值。让我们考虑以下函数:
def ex(foo):
a = 42
if foo:
return a
else:
return 6*7
函数之外的任何事情是否关心 a
是 returned 还是 6*7
?并不真地。无论哪种方式都是42。如果您确实关心这种差异,那么您应该在函数内部知道这一点。在外部,您应该引用用于捕获 return 值的变量的名称。
备选方案:
你说你想在没有用户操作的情况下进行日志记录,但是将装饰器添加到函数并不比显式日志记录简单多少——而且可以说不太清楚。同样,同样的原则适用 - 你关心函数内部的名称 - 这就是你需要进行日志记录的地方。
我有
def foo(arg1, arg2):
a = 5
b = "hi"
return a, b, "c"
我想要一些 magic(foo)
returns ("a", "b", "un-named")
或类似的东西。
在Python中有类似的东西吗?
编辑:为什么?
创建一个记录器装饰器,为读者提供日志中值的上下文。
使用 inspect.getsourcelines
并尝试查找 return
关键字的可能初始实现。我想可能有很多边界情况会失败,但我们开始吧:
import inspect
def magic(function):
return_lines = list()
for line in inspect.getsourcelines(function)[0]:
line = line.strip()
if line.startswith("return"):
return_lines.append(tuple(line[7:].split(", ")))
return return_lines
>>> magic(foo)
[('a', 'b', '"c"')]
好的,因为 OP 要求我详细说明评论中关于为什么这是一个坏主意以及有哪些替代方案的讨论。
为什么不呢: 一旦你 return 函数中的值,你就不应该再关心它们里面有什么名字了。毕竟,调用什么变量并不重要,重要的是 returned 的值。让我们考虑以下函数:
def ex(foo):
a = 42
if foo:
return a
else:
return 6*7
函数之外的任何事情是否关心 a
是 returned 还是 6*7
?并不真地。无论哪种方式都是42。如果您确实关心这种差异,那么您应该在函数内部知道这一点。在外部,您应该引用用于捕获 return 值的变量的名称。
备选方案: 你说你想在没有用户操作的情况下进行日志记录,但是将装饰器添加到函数并不比显式日志记录简单多少——而且可以说不太清楚。同样,同样的原则适用 - 你关心函数内部的名称 - 这就是你需要进行日志记录的地方。