まあ、それは私が少し実験するのに十分興味深く、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は名前がオーバーライドされません。pprintglobalsglobaltwo()
メソッドthree()では、ローカルスコープに名前の宣言がないpprintため、デフォルトpprintでモジュールであるグローバル名になります
ではmain()、最初にキーワードglobal が使用されるpprintため、メソッドのスコープ内のすべての参照は名前main()を参照します。ご覧のとおり、最初はモジュールであり、メソッドでオーバーライドされますglobalpprintglobal namespacefrom 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 * の名前をオーバーライドしたため、最初のインポートは無効になりました。datetimeimport datetime
道徳: したがって、インポートの順序、インポートの性質 (x インポート * から)、およびインポートされたモジュール内のインポートの認識が重要です。