在Python中,“from Module import ClassName”是典型用法吗?
因为我喜欢小文件,所以我通常在每个Python模块里只放一个“公共”类。我会把模块命名为和它包含的类相同的名字。比如说,类ToolSet
会定义在ToolSet.py
这个文件里。
在一个包里,如果其他模块需要创建一个ToolSet
类的对象,我会使用:
from ToolSet import ToolSet
...
toolSet = ToolSet()
而不是:
import ToolSet
...
toolSet = ToolSet.ToolSet()
这样做是为了减少“重复”(我更喜欢在文件顶部看到重复,而不是在我的代码中)。
这样做对吗?
这里有个相关的问题。在一个包里,我通常有少量的类想要对外公开。我会在那个包的__init__.py
文件里导入这些类。比如说,如果ToolSet
在UI
包里,而我想要公开它,我会在UI/__init__.py
里写:
from ToolSet import ToolSet
这样,从外部模块我就可以写
import UI
...
toolSet = UI.ToolSet()
再问一次,这样做算不算符合Python的风格?
4 个回答
要判断这是否符合 Python 的风格,可以看看网上通常被认为是权威的答案: http://effbot.org/zone/import-confusion.htm
另外,也可以看看 ~unutbu 的链接,里面对这个问题有更详细的讨论。
是的,我认为这两种写法在Python中都是很常见的。
我通常会用 from module import name
这种方式来导入一些标准库里的模块,比如 datetime
,主要是对那些关系紧密的模块,或者是那些在模块中经常用到的名字。例如,我一般会用这种方式导入ORM类。
而对于一些标准模块(特别是 os
和 os.path
),我更倾向于使用 import module
这种写法,尤其是当名字不太明显的时候(比如 database.session
和 cherrypy.session
是两种不同的会话),还有那些不常用的名字,提到模块名会让代码更容易理解。
总的来说,有一些经验法则(比如 import os.path
),但到底用哪种写法,主要还是看个人的判断、喜好和经验。
关于你第一个问题,我用的就是这种说法,而且这种用法得到了PEP8,Python的风格指南的支持。
不过这样说也是可以的:
from subprocess import Popen, PIPE
我喜欢这种写法,因为它减少了输入的字数,并且确保在文件运行时就能立刻发现问题(比如你拼错了一个导入),而不是等到稍后某个使用了这个导入的函数运行时才发现。
比如说,如果模块Thing
里没有Thyng
这个成员:
from Thing import Thyng
你一运行.py
文件就会出错,而
import Thing
# ...
def fn():
Thing.Thyng()
直到你运行fn()
时才会出错。
至于你第二个问题,我觉得那也是个好习惯。当我把一个大的.py文件拆分成一个目录,并且里面有一个__init__.py
和一些实现文件时,这种情况经常发生。把东西导入到__init__.py
里可以保持接口的一致性。这在标准库中也是一种常见的做法。