繁体   English   中英

从另一个文件导入功能,在哪里导入其他库?

[英]Importing a function from another file, where to import other libraries?

一个简单的问题,我搜索无济于事。 假设我有一个文件“ funcs.py”,其中有一个函数要调用到当前脚本中。 该函数使用另一个库(例如pandas),该库从哪里导入? 有什么约定?

是否将其放在funcs.py中的函数中?

#funcs.py
def make_df():
    import pandas as pd
    return pd.DataFrame(index=[1,2,3],data=[1,2,3])

难道我把它的功能 funcs.py?

#funcs.py
import pandas as pd

def make_df():
    return pd.DataFrame(index=[1,2,3],data=[1,2,3])

还是将其放在当前使用的脚本中?

#main.py
import pandas as pd

from funcs import make_df

df = make_df()

谢谢和亲切的问候。

#3不起作用。 在大多数情况下,#2是首选选项(主要的例外是,如果库是仅由该函数使用的大型(缓慢导入)库)。 您可能还需要考虑以下选项之一(用于可选的依赖项):

#funcs.py
try:
    import pandas as pd
except ImportError:
    pass

def make_df():
    return pd.DataFrame(index=[1,2,3],data=[1,2,3])

要么

#funcs.py
try:
    import pandas as pd
except ImportError:
    pass

if pd is not None:
    def make_df():
        return pd.DataFrame(index=[1,2,3],data=[1,2,3])

在Python中,每个文件都是一个模块 每个模块都有自己的名称空间 -自己的变量集。 每个函数还具有其自己的本地名称空间。

当您在模块func定义的函数中使用名称pd时,它将首先在该函数中查找局部变量pd -如果它不存在,它将在其模块func的名称空间中查找它。 即使调用该函数的代码在main.py中,它也不会main模块中寻找它。

这就是所谓的词法作用域-规则是在定义代码的位置而不是在使用代码的位置附近查找变量。 有些语言的确会在靠近代码使用位置的地方查找变量,这被称为动态作用域-在其中一种语言中,例如您的解决方案#3都可以使用,但是大多数语言(包括Python)都遵循词法作用域规则,因此将不起作用。

因此,必须将熊猫导入funcs.py中。 main.py不必导入或什至不了解有关熊猫的任何信息即可使用make_df

如果您在func.py的顶部导入pandas,则从main.py导入模块func时,将执行func.py顶部的import pandas as pd行,将加载pandas模块,对它的引用将在func创建,绑定到名称pd 无需在main.py中重新导入它。

如果您确实在main.py中重新导入了pandas,那么Python会很聪明,不会仅仅因为您在两个地方导入了pandas而重新加载了整个模块,它只是为您提供了对已经加载的pandas模块的引用。

将导入放在函数主体中将起作用,但除非您有充分的理由,否则不认为这是一种好习惯。 通常,导入位于使用它们的文件的顶部。

直接从https://www.python.org/dev/peps/pep-0008/?#imports

导入总是放在文件的顶部,紧随任何模块注释和文档字符串之后,以及模块全局变量和常量之前。

最佳实践是在执行任何其他编码之前,在脚本文件的前几行中进行所有导入

最佳做法是将代码的开头包含在funcs.py

不需要,您不应该在main.py包括pandas

基本上,当您使用import pandas pandas库将成为您代码的一部分。

暂无
暂无

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

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