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

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

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

我也认为你可以注入对locals()and的调用globals()

无论如何,我喜欢 python,因为它对导入非常明确。如果使用了名称,您通常可以准确地追溯到该名称的定义位置。但是,我最近遇到了一些模块,我想在其中找到名称qux的定义位置。模块本身包含 no from something import *, no locals​​or globals,但是当我 CTRL+F 为该名称时,我只在表达式的 RHS 上找到它,没有定义!

所以我的问题是:一个名字可以通过哪些机制进入本地命名空间?正常导入可以注入我的本地命名空间吗?

4

3 回答 3

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)
于 2012-06-28T20:02:52.197 回答
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。

于 2012-06-28T19:57:43.423 回答
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. 它们被注入到您由另一个模块导入的模块中 - 例如由您显式导入的模块之一导入的模块。
于 2012-06-28T20:03:02.050 回答