[英]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.