2014-09-30 59 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