如何将Python代码构造成模块/包?

2024-06-01 00:01:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这个赤骨结构:

project/
  main.py
  providers/
    __init.py__
    acme1.py
    acme2.py
    acme3.py
    acme4.py
    acme5.py
    acme6.py

假设main.py包含(部分):

if complexcondition():
  print providers.acme5.get()

其中__init__.py为空且acme*.py包含(部分):

def get():
  value=complexcalculation()
  return value

如何将这些文件更改为正常工作?

注意:如果答案是__init__.py中的“import acme1”、“import acme2”等,是否有办法在不手动列出它们的情况下完成这项工作?


Tags: pyimportprojectgetinitvaluemain结构
3条回答

如果我正确地阅读了您的问题,看起来您并没有尝试进行任何动态导入(如Van Gale提到的问题),而实际上只是尝试导入providers包中的所有模块。如果是这样的话,在__init__.py中,您需要使用以下语句:

__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]

然后把你要用的东西从。。。进口*

from providers import *

然后,不用在代码中显式地使用包名称,只需调用导入的类

acme1.get()
acme2.get()

如果providers包中有足够的模块,在填充__all__列表时会出现问题,那么您可能需要考虑将它们分解成更小的包或以其他方式存储数据。我个人不希望每次我想重新使用这个包时都要处理动态导入schennagins的问题。

今天问的这个问题,Dynamic Loading of Python Modules应该有你的答案。

嘿!两年后但是。。。也许对某个人有帮助

使您的提供者/uu init_uuu.py像这样:

import os
import glob

module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]

如果以后添加或删除任何提供程序/acme*.py

然后在main.py中使用from providers import *

相关问题 更多 >