2014-09-30 57 views
0

我在Python中查找使用dir(),我遇到以下示例,其中support只是包含函數print_func的用戶定義模塊,該函數打印傳遞給它的參數。瞭解Python中的dir()

print dir(support) 

Output: ['__builtins__', 
     '__doc__', 
     '__file__', 
     '__name__', 
     '__package__', 
     'print_func'] 

我基本上不明白下面的語句是指:

在上面的電話,__name__是模塊的文件名和__file__是從哪個模塊的加載的文件名。

是不是__name____file__一樣?

+0

你看過這兩個屬性了嗎? *是*他們是一樣的嗎? – jonrsharpe 2014-09-30 11:14:47

+0

'__file__'給你的位置就像''numpy .__ file__ - > /usr/lib/python3/dist-packages/numpy/__init__.py' ','__name__'給出名字'numpy .__ name__ - >'numpy ' '就像這樣他們絕對不一樣 – 2014-09-30 11:14:52

+4

這句話最多不準確,你是從哪裏找到的? – 2014-09-30 11:14:57

回答

3

不,__name____file__是不一樣的。

__name__是Python認爲它的模塊名稱;它是模塊存儲在sys.modules中的關鍵。對於sessions,這將是...... 'sessions'

__file__屬性是從中加載模塊的文件名。它可能是.py文件,.pyc文件,如果從一個Bytecache加載,它可能是一個共享動態庫文件等。

然後,您發現的文本最多是不精確的。您的sessions模塊可以從文件/foo/bar/baz/sessions.py加載,然後模塊名稱sessions是文件名的一部分。

注意__name__不一定是模塊作爲進口的名字:

>>> import os.path as os_path 
>>> os_path.__name__ 
'posixpath' 

兩件事情是怎麼回事:我們進口的模塊以不同的名稱; os_path綁定到os.path模塊對象。但os模塊做類似的東西:它以新的名稱進口特定於平臺的模塊也

if 'posix' in _names: 
    # .... 
    import posixpath as path 

所以os.path是真正爲posixpath模塊的別名。在Windows上,它將使用ntpath模塊。

+2

另外值得一提的是'__name__'不一定是模塊在當前範圍內綁定的名稱。在'import sys as foo'後面,'foo .__ name__'仍然是'sys',並且在'import os'之後,'os.path .__ name__'是實際加載的特定於平臺的模塊,用作'os.path' 。 – chepner 2014-09-30 11:51:08

+0

@chepner:那確實值得一提;我現在這樣做了。 – 2014-09-30 12:04:27

+0

也許你想提一下顯而易見的'__name__ =='__main __''。 – tripleee 2014-10-01 03:52:56