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

时间:2018-09-26 21:28:24

标签: python python-3.x

一个简单的问题,我搜索无济于事。假设我有一个文件“ 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()

谢谢和亲切的问候。

4 个答案:

答案 0 :(得分:1)

#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])

答案 1 :(得分:1)

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

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

中,它也不会在模块main中查找它。

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

因此必须将熊猫导入funcs.py中。 main.py不必导入甚至 对熊猫一无所知,可以使用make_df

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

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

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

答案 2 :(得分:0)

直接从https://www.python.org/dev/peps/pep-0008/?#imports的源头获取

  

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

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

答案 3 :(得分:0)

最佳做法是将代码放在funcs.py

的开头

没有必要,您不应该在pandas中加入main.py

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