这是一个最佳实践问题。如果我有大量的自定义类,但是在我的主程序中不想要它们,那么在顶部粘贴`from someFile import *'是否可以接受?我知道我不会做任何事情来编辑/重新定义该文件中的类,函数和变量。
from someFile import *
a = someFunction()
#Other stuff
someFile只包含我知道工作的各种自定义类和函数,每次我在程序中工作时都不需要滚动过去。只要我很小心有没有理由不这样做?
答案 0 :(得分:4)
如果您使用了很多类,那么避免使用这种语法通常会更安全。特别是如果您使用第三方类,因为其中一些可能具有相同的方法。 (例如,sin,cos等)你可以得到奇怪的行为。
在我看来,当您提供代码使用示例时,可以使用此语法。通过这种方式,您只需获取类似的方法,以更清晰的方式显示功能。
我个人试图避免这种语法。我更愿意明确地称之为"对"类。如果您不想编写长类/模块名称,请尝试将它们作为别名加载,如
import LongModuleName as LM
答案 1 :(得分:3)
http://www.python.org/dev/peps/pep-0008/#imports
根据pep-8:
There is one defensible use case for a wildcard import, which is to republish an internal interface as part of a public API (for example, overwriting a pure Python implementation of an interface with the definitions from an optional accelerator module and exactly which definitions will be overwritten isn't known in advance).
答案 2 :(得分:2)
在我看来,from someFile import *
语法最有用的情况可能就是你以交互方式使用python解释器。想要做一些快速数学的图像:
$ python
>>> from math import *
>>> sin(4.0)
当使用pylab
和ipython
将ipython
会话转换为仅使用from pylab import *
行的MATLAB克隆时,此功能特别有用。
答案 3 :(得分:1)
from module import *
的一个问题是,它很难看出不同功能的来源,比较:
import random
random.shuffle(...)
from random import shuffle
shuffle(...)
from random import *
shuffle(...)
另一个是名称冲突的风险;如果两个模块具有相同名称的类或函数,import *
将与另一个模块相同。使用from x import y
,您可以在顶部看到您可能需要from z import y as y2
。
答案 4 :(得分:0)
只要您知道将所有内容导入该模块的命名空间,就可以使用from someFile import *
。如果您正在重复使用名称,这可能会导致冲突。
考虑仅导入您在该模块中实际使用的类和函数,因为对于可能正在阅读源代码的其他人来说,它更明确。它还可以更容易地找出函数的定义位置:如果我看到一个函数并且无法在同一个文件中找到显式导入行,那么我将被迫更广泛地进行grep / search以查看函数的定义位置