假设我有一个具有函数bar
的模块PyFoo.py
。我希望bar
打印与调用它的名称空间相关联的所有局部变量。
例如:
#! /usr/bin/env python
import PyFoo as pf
var1 = 'hi'
print locals()
pf.bar()
最后两行将产生相同的输出。到目前为止,我已经尝试这样定义bar
:
def bar(x=locals):
print x()
def bar(x=locals()):
print x
但这两种方法都不起作用。第一个是bar
名称空间的本地名称(我猜这是因为它是在这个时候求值的),第二个是我传入的globals
(我认为这是因为它在import
期间求值)。
有没有一种方法可以让bar
的参数x
的默认值成为名称空间bar
中的所有变量
编辑2018-07-29:
正如已经指出的,所给出的是一个XY问题;因此,我将给出细节。
我正在组装的模块将允许用户创建表示数值问题的不同方面的各种对象(e.x。各种拓扑定义、边界条件、本构模型等。)并定义任何给定对象如何与任何其他对象交互。这个想法是让用户导入模块,定义他们需要的各种模型实体,然后调用一个函数,该函数将接受传递给它的所有对象,进行必要的调整以确保它们之间的能力,然后将表示整个数值问题的文件写出为文本文件。
该模块有一个函数generate
,它接受数值问题的各种类型的方面中的每一个。所有参数的默认值都是一个空列表。如果传递了一个非空列表,那么generate
将使用这些实例来生成完整的数值问题。如果一个参数是一个空列表,那么我希望它接受调用generate
的名称空间中的所有实例(然后我将解析出该参数的适当实例)。
编辑2018-07-29:
很抱歉我对此缺乏理解(我不是一个很强的程序员),但我想我可能理解您关于被声明或注册的实例所说的话。
根据我有限的理解,这是否可以通过在导入模块时创建的模块中创建某种注册表数据集(如list
或dict
)来实现,并且默认情况下所有模块类都接受此注册表对象。在类初始化期间,可以将self
附加到所述数据集,然后genereate
函数将把注册表作为其中一个参数的默认值?
发布于 2018-07-29 12:49:29
你不可能直接做你想做的事。
locals
只返回调用它的任何名称空间中的局部变量。正如您所看到的,您可以访问定义函数时在其中定义函数的名称空间,并且可以从函数内部访问函数本身的名称空间,但不能访问任何其他名称空间。
你可以间接的做你想做的事情…但几乎可以肯定,这是一个糟糕的想法。至少这闻起来像是XY problem,不管你真正想做的是什么,可能有更好的方法去做。
但有时这是必要的,所以如果你遇到这样的情况:
想要知道调用者的本地变量的主要原因是为了某种调试或其他自省函数。而进行内省的方法几乎总是通过inspect
库。
在本例中,您要检查的是the interpreter call stack。调用函数将是调用堆栈中位于函数自身框架后面的第一个框架。
你可以得到原始的堆栈框架:
inspect.currentframe().f_back
…或者,您可以获得一个表示它的FrameInfo
:
inspect.stack()[1]
正如inspect
文档顶部所解释的,frame对象的本地命名空间可用如下所示:
frame.f_locals
注意,这与使用locals
获取您自己的本地变量有相同的警告:您得到的不是活动的名称空间,而是一个映射,即使它是可变的,也不能用于修改名称空间(或者,更糟糕的是,在2.x中,可能会也可能不会修改名称空间,这是不可预测的),并且所有的单元格和自由变量都被展平为它们的值,而不是它们的单元格引用。
此外,请参阅文档中关于不必要地保持frame对象存活的警告(或者如果您需要保留快照但不是所有引用,则调用其clear
方法,但我认为这只存在于3.x中)。
https://stackoverflow.com/questions/51576921
复制相似问题