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 *、 nolocalsまたはが含まれています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

具体的な例で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. それらは、明示的にインポートしたモジュールの 1 つによってインポートされたモジュールなど、別のモジュールによってインポートされたモジュールに注入されます。
于 2012-06-28T20:03:02.050 に答える
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 を 6 つの異なる方法で定義します。

于 2012-06-28T19:57:43.423 に答える