まあ、それは私が少し実験するのに十分興味深く、http://docs.python.org/reference/executionmodel.htmlを読みました。
次に、あちこちでコードをいじくり回しましたが、これが私が見つけたものです:
コード:
import pprint
def two():
from pprint import pprint
print globals()['pprint']
pprint('Eggs')
print globals()['pprint']
def main():
if 'pprint' in globals():
print 'pprint is in globals()'
global pprint
print globals()['pprint']
pprint.pprint('Spam')
from pprint import pprint
print globals()['pprint']
pprint('Eggs')
def three():
print globals()['pprint']
pprint.pprint('Spam')
if __name__ == '__main__':
two()
print('\n')
three()
print('\n')
main()
出力:
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Eggs'
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
pprint is in globals()
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
<function pprint at 0xb7d596f4>
'Eggs'
のスコープ内ではキーワードが使用されていないため、メソッド内でtwo()
from pprint import pprint
は名前がオーバーライドされません。pprint
globals
global
two()
メソッドthree()
では、ローカルスコープに名前の宣言がないpprint
ため、デフォルトpprint
でモジュールであるグローバル名になります
ではmain()
、最初にキーワードglobal
が使用されるpprint
ため、メソッドのスコープ内のすべての参照は名前main()
を参照します。ご覧のとおり、最初はモジュールであり、メソッドでオーバーライドされますglobal
pprint
global
namespace
from pprint import pprint
これは質問の答えではないかもしれませんが、それでも興味深い事実だと思います。
=====================
編集もう一つの興味深いこと。
モジュールがある場合は、次のように言います。
mod1
from datetime import datetime
def foo():
print "bar"
そして別の方法は言う:
mod2
import datetime
from mod1 import *
if __name__ == '__main__':
print datetime.datetime.now()
datetime
にモジュールをインポートしたので、一見正しいように見えますmod2
。
mod2 をスクリプトとして実行しようとすると、エラーがスローされます。
Traceback (most recent call last):
File "mod2.py", line 5, in <module>
print datetime.datetime.now()
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
2 番目のインポートが名前空間from mod2 import *
の名前をオーバーライドしたため、最初のインポートは無効になりました。datetime
import datetime
道徳: したがって、インポートの順序、インポートの性質 (x インポート * から)、およびインポートされたモジュール内のインポートの認識が重要です。