一个简单的问题,我搜索无济于事。假设我有一个文件“ 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()
谢谢和亲切的问候。
答案 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
库成为代码的一部分时。