Python:列出函数中使用的静态变量

Python:列出函数中使用的静态变量,python,Python,我想定义一个函数random_func,其中包含一些参数,如arg_1和arg_2,以及该函数中的一些变量,如arg_3,arg_4 如何获取此函数中以arg开头的这些参数和参数的列表,并返回它们相应的值 例如: 我通过使用dir()列出所有变量,然后通过调用eval()函数来连接所有值 def random_func(arg_1,arg_2): arg_3=“a” arg_4=“b” list=[name for name in dir()如果name.startswith(“arg_”)]

我想定义一个函数
random_func
,其中包含一些参数,如
arg_1
arg_2
,以及该函数中的一些变量,如
arg_3
arg_4

如何获取此函数中以
arg
开头的这些参数和参数的列表,并返回它们相应的值

例如:

我通过使用
dir()
列出所有变量,然后通过调用
eval()
函数来连接所有值

def random_func(arg_1,arg_2):
arg_3=“a”
arg_4=“b”
list=[name for name in dir()如果name.startswith(“arg_”)]
返回“-”。连接(列表中x的eval(x)
但是,如果我运行,会出现以下错误:

random_func(arg_1="one", arg_2="two")
>>> NameError: name 'arg_1' is not defined
理想情况下,我会:

one-two-a-b

我能做些什么?

注意:这是一个糟糕的主意,我怀疑。如果你继续阅读,你就会明白你正在迷失方向,可能无法解决你真正的问题

您可以使用
locals()
dict
格式获取函数局部变量的只读视图;它将允许您访问名称和值,而无需依赖
eval
(速度慢且更危险):

def random_func(arg_1,arg_2):
arg_3=“a”
arg_4=“b”
返回“-.join([val表示名称,val表示局部变量().items()(如果name.startswith(“arg”)]))
打印(随机函数(“一”、“二”))


根据您的需要,它打印出
one-two-a-b
,并且它完全不依赖
eval

您想在
random\u func
内部执行此操作吗?还是从外面?因为从外部看,这些都不是“静态的”,每次调用函数时,它们都被设置为本地变量。您显然忽略了这里的上下文(
tmp\u 1\u base
在您所展示的内容中不存在);你能提供一个坏代码的例子吗?我真的不明白你的意思
arg_3
et al.甚至不能传递给构造函数,那么为什么要将其称为参数呢?这里有问题。我已经再读了三遍这个问题,但我不明白最终目标是什么。在我看来,这似乎是一个XY问题。你到底想解决什么问题?@kaya3:事实上,这样可能更好;想必,处理已经存在的局部变量所涉及的任何局部变量都不应包含在要处理的局部变量集中,因此将它们放在单独的范围内是一件好事。如果您试图在Python2上使用列表理解解决方案,它可能很容易崩溃(因为listcomps在Py2上没有单独的作用域,而genexprs和其他理解则有;这在Py3上被规范化为所有人的单独作用域)。@kaya3嗯,线程中的大象是
eval
无论
locals()
是只读的-在Python 3.6.2中,您可以在REPL中执行
locals().clear()
,例如,它确实删除了所有变量。回答很好,我已经阅读了有关XY问题的内容。下次我会更加小心的。谢谢你的帮助。@kaya3这里的“只读”应该理解为“修改它几乎永远不会达到你想要的效果”。REPL中使用
locals().clear()
的唯一原因是REPL在全局范围内运行,这意味着
locals()
相当于
globals()
(可以通过可预测的行为进行修改)。将
locals().clear()
放在一个函数中(在REPL中定义与否),它不会做太多事情(
def test(a):locals().clear();print(a)
如果调用
test(“abc”)
,即使你刚刚告诉它删除所有的局部变量,它也会成功地打印
abc
。@capm下次不会了。现在你试图做的事情毫无意义,表明你有问题