在Python中将对象添加到本地作用域的所有方法是什么?

时间:2012-06-28 19:44:42

标签: python

my_var = 3
assert('my_var' in locals())

import a_module
assert('a_module' in locals())

from sys import *
assert('stdin' in locals())

我还认为您可以通过拨打locals()globals()

来接听电话

无论如何,我喜欢python,因为它对进口非常明确。如果使用名称,通常可以追溯到该名称的确切位置。但是,我最近遇到了模块,其中我想找到名称qux的定义位置。模块本身不包含from something import *,没有localsglobals,但是当我使用CTRL + F获取该名称时,我只能在表达式的RHS上找到它,无法定义!

所以我的问题是:名称可以进入本地名称空间的所有机制是什么?普通导入可以注入我的本地命名空间吗?

3 个答案:

答案 0 :(得分:1)

其他一些模块可能会在此模块中注入名称:

#x.py
import y
y.lol = 1
y.func()

这个模块没有定义它:

#y.py
def func():
    print(lol)

有人可能会在另一个模块中注入代码的另一种疯狂方式是:

#a.py
import sys
sys._getframe(1).f_globals['lol'] = 1

因此,a.py会在导入它的人身上注入名称lol

#b.py
import a
print(lol)

答案 1 :(得分:0)

很多事情基本上只是花哨的任务陈述:

# mod1.py
a = 1
import b
from mymodule import c
def d(): pass
class e(object): pass

# mod2.py
import mod1
mod1.f = 17

这里我们以六种不同的方式定义mod1中的名称a,b,c,d,e,f。

答案 2 :(得分:0)

在您的具体示例中,iac很可能是由以下库/模块之一导出/注入的全局变量:

from PyQt4 import QtGui, QtCore
import xml.etree.ElementTree as etree
import threading
from OSC import ThreadingOSCServer, OSCMessage
import socket
from AddMIDIForwardWindow import AddMIDIForwardWindow

我的猜测是它与OSC软件/硬件(OSC导入)有关。似乎ISC是MIDI硬件的驱动程序,iac是库创建的对象引用,允许您与ISC驱动程序进行交互。

要回答您的问题,如果它们是变量/对象,则通过在同一块中定义来进入本地命名空间。如果您继承另一个类,那么您的“本地”命名空间中也可能包含某些内容。因此,变量可以进入可以使用的命名空间的方式是:

  1. 它们是在本地定义的。
  2. 他们是您的超类的成员。
  3. 它们是从模块明确导入的。
  4. 它们被注入到由另一个模块导入的模块中 - 例如由您明确​​导入的模块之一导入的模块。