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 *
,没有locals
或globals
,但是当我使用CTRL + F获取该名称时,我只能在表达式的RHS上找到它,无法定义!
所以我的问题是:名称可以进入本地名称空间的所有机制是什么?普通导入可以注入我的本地命名空间吗?
答案 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驱动程序进行交互。
要回答您的问题,如果它们是变量/对象,则通过在同一块中定义来进入本地命名空间。如果您继承另一个类,那么您的“本地”命名空间中也可能包含某些内容。因此,变量可以进入可以使用的命名空间的方式是: