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

Dec*_*lan 6 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])
Run Code Online (Sandbox Code Playgroud)

我是否将其放在funcs.py 的函数之外?

#funcs.py
import pandas as pd

def make_df():
    return pd.DataFrame(index=[1,2,3],data=[1,2,3])
Run Code Online (Sandbox Code Playgroud)

或者我是否将其放入我正在使用的当前脚本中?

#main.py
import pandas as pd

from funcs import make_df

df = make_df()
Run Code Online (Sandbox Code Playgroud)

谢谢并致以亲切的问候。

jbc*_*bch 7

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

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

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

所以必须在 funcs.py 中导入 pandas 。main.py 不需要导入,甚至不需要知道任何关于 pandas 的信息就可以使用make_df

如果你在 func.py 的顶部导入 pandas,那么当你从 main.py 导入模块时, func.py 顶部的func行将被执行,pandas 模块将被加载,并且对它的引用将被与名称绑定import pandas as pd创建funcpd。无需在 main.py 中重新导入它。

如果你在 main.py 中重新导入 pandas,Python 会足够聪明,不会仅仅因为你在两个地方导入它而重新加载整个模块,它只会为你提供对已加载的 pandas 模块的引用。

将导入放入函数体内是可行的,但这不被认为是好的做法,除非您有充分的理由这样做。通常导入位于使用它们的文件顶部。