使用单独的Python函数导入依赖项

问题描述 投票:0回答:2

确实是一个简单的问题:我正在构建一个标准存储库来执行一些简单的机器学习任务,并且我几乎总是在这些 .py 模块中导入相同的依赖项。

我在想,如果我可以制作一个导入所有标准依赖项的 .py 文件,它会让我的代码变得更加混乱(并节省时间)。然后可以将其扩展到取决于模型的不同类别,例如sklearn、xgboost 等

1)从外部函数调用依赖项是明智的做法吗? 2)如果是这样,如何最好地做到这一点?

到目前为止,我已经尝试过以下方法:

project_dependencies.py
包含

def get_dependencies():
    import numpy as np

if __name__ == "__main__":
    get_dependencies() 

model.py
可能包含

from project_dependencies import get_dependencies

get_dependencies()

def model():
    return np.random.normal(1)

if __name__ == "__main__":
    model()

但这似乎不起作用。一个好的、长期的解决方案是什么?谢谢!

python python-3.x import python-import
2个回答
1
投票

一般建议是在需要的模块/文件中导入所需的模块。这有时需要一些额外的输入,但使每个文件/模块更加独立。

另一种(但不太推荐)方法可能是导入包的

__init__.py
文件中的所有依赖项(几乎没有其他内容),然后在其他包模块中进行相对导入,例如
from . import *

尽管经常,
__init__.py
倾向于以相反的方式使用:它(相对)导入包模块中由
__all__
定义的所有内容。


基本上,看看其他一些知名的较大项目,看看他们做了什么。 Django、requests、NumPy 等。您可能会发现它们在每个模块中单独导入外部依赖项,而仅对内部依赖项(类、函数等)使用相对导入。也就是说,他们使用第一个选项。


0
投票

我同意user707650的一般指导,但你可以做你想做的:

  • 用一堆 import X,Y,Z
    制作一个 
    dependency.py
  • 在某些 other_file.py 中,只需调用
    from dependencies import *

你的想法不起作用,因为解释器创建了一个位于正在执行的函数本地的new命名空间...所以你的导入被导入到that命名空间中,但它与你的命名空间分开,而且当函数执行时立即终止已完成。除了

return
语句中列出的内容之外,您永远不会从函数中得到任何内容。

换句话说,这必须通过执行 import 语句来完成,而不是执行函数。

© www.soinside.com 2019 - 2024. All rights reserved.