繁体   English   中英

在Python中导入多个文件

[英]Importing in Python for multiple files

我正在努力弄清楚如何处理在多个文件中使用的导入依赖项。

假设我要导入一个外部API,例如,有两个类依赖于此导入。 尝试将导入放入“索引”文件中,以使其变为全局性尝试不起作用。 我可以在每个类文件中很好地导入它,但这似乎违反了DRY,并且稍后将自己设置为失败。

那么,是否有一种方法可以在可全局访问的单个文件中一次导入? 我尝试的是创建index.pyfoo.py (对于foo类)和bar.py (对于bar类):

指数:

from example import API
import foo
import bar

foo()
bar()

foo.py:

class foo:
    ... (try to put the example API to use)

bar.py :(实际上与foo.py相同,只是为了在两个不同的地方使用相同的依赖项foo.py

由于类似乎无法访问exampleAPI ,因此无法正常工作。 正确的做法是什么,还是我看错了? 谢谢!

通常,您应该在需要使用它的每个自己的模块中导入所需的每个模块。 您不必担心重复,因为每个模块都有自己的全局名称空间。 此外,模块被缓存(在sys.modules词典中),因此您无需担心要多次加载模块的额外工作。

也就是说,可能会有一些例外。 例如,如果某个API的特定来源被视为“私有”信息(例如,因为它是一个实现细节,或者因为它可能是可配置的,并且并不总是始终来自同一位置),则可以将其导入所有其他用户将在其中寻找的名称空间。

另一方面,您的示例表明您可能比应做的更多拆分代码。 与其他一些语言(例如Java)不同,在Python中,每个类都不需要也不建议每个类都驻留在其自己的文件中。 相反,您应该将代码分成多个模块,这些模块由它们之间的交互程度决定。 紧密相关的类应该是同一模块的一部分,而根本不交互的部分在单独的模块中可能更有意义(特别是如果某些其他代码可能需要一个部分而不需要另一个部分的话)。 将整个程序放在一个模块中可能并不适当! 显然,其中一些是风格和品味的问题,因此对于每种程序员在每种情况下都没有一个最佳选择。

对于您的示例代码,如果您想保留单独的模块,我建议使用以下内容:

index.py

from foo import Foo # no need to import API here if you're not using it directly
from bar import Bar

foo = Foo() # create an instance of the foo class
result = foo.some_method() # call methods on it
bar = Bar(foo) # you can also pass your instances around to other classes

foo.py

from example import API

class Foo:
    def some_method(self):
        return API.whatever() # use the API in some way

bar.py

from example import API # don't worry about importing the API more than ocne

class Bar:
    def __init__(self, foo):
        self.foo = foo

    def blah(self):
        API.something_else(self.foo.some_method())

请注意,我更改了一些名称。 Python的约定是将CapitalizedNames用于类,将lowercase_names_with_underscores (有时称为“蛇格”)用于模块,变量和方法。 您的原始代码似乎在模块名称foobar与模块中具有相同名称的类之间有些混淆。 为不同的名称使用不同的样式可以避免这种混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM