我想创建一个可以与他人共享的模块,但是我对此还很陌生,并且在整理它以供他人使用的最后一步中遇到了问题。想象一下,它叫做my_module.py
之类,看起来像这样:
import pandas as pd
def function_1(a,b):
return a*b
def function_2(c,d):
return pd.DataFrame(data=c,columns=d)
我希望它可以被其他人导入,以便他们可以使用诸如以下的基础功能:
my_module.function_1(a=5,b=2)
,依此类推。但是,如果我执行import my_module
,则my_module.pd
也会出现在自动完成中(如pandas
所做的my_module.py
导入一样。)
对我来说,这似乎是可怕的做法。那么,加载这些导入的正确方法是什么?
理想情况下,这是可共享的,以便有人可以像安装统计模块那样安装它。如果解决方案只是一种检查以确保以某种方式导入的东西,那我很好。
答案 0 :(得分:1)
您所做的工作本质上没有错。您的模块需要 pandas
,因此必须将其导入。 PEP8指定导入应放在顶部,而不是嵌套在函数中。这样做会在您import my_module
之后将其添加为属性。因为您是基于pandas
构建的,所以不能只共享模块,还需要共享pandas
(或检查它们是否已经安装了正确或足够版本的pandas
)。>
不过,当您只有一个仅使用pandas
类的函数时,导入整个DataFrame
库可能会过大。在这种情况下,您可以执行以下操作:
from pandas import DataFrame
def function_1(a,b):
return a*b
def function_2(c,d):
return DataFrame(data=c,columns=d)
现在my_module
将仅附加一个.DataFrame
类,而不是整个pandas
库。如果您确实在模块中使用了越来越多的pandas
库,那么导入单独的部分会很麻烦,因此只需导入pandas
。
以pandas
为例,它是建立在numpy
之上的。每个DataFrame的下面都有一个numpy.ndarray
,因此您可能没有注意到它,但是numpy
在那里:
import pandas as pd
pd.np?
Type: module
String form: <module 'numpy' from 'c:\\program files\\python36\\lib\\site-packages\\numpy\\__init__.py'>
File: c:\program files\python36\lib\site-packages\numpy\__init__.py
Docstring:
NumPy
=====
您可以使访问pandas
属性更加困难,但是您需要重新组织您的媒体库的分发方式。假设您要共享一个名为MyLibrary
的库,该库可以由几个模块组成(我们将在模块文件夹中放置它们)。它们每个都有自己的功能,其名称不应重叠,我们需要在单独的python脚本(api.py
)中导入这些名称。然后您会这样做:
MyLibrary/
__init__.py
modules/
MyModule1.py
api.py
我们有文件的位置:
from MyLibrary.modules.api import *
from MyLibrary.modules.MyModule1 import function_1, function_2
import pandas as pd
def function_1(a,b):
return a*b
def function_2(c,d):
return pd.DataFrame(data=c,columns=d)
现在我们可以使用这些功能,但是pd
不再存在:
import MyLibrary
MyLibrary.function_2([1], ['a'])
# a
#0 1
MyLibrary.pd
#AttributeError: module 'MyLibrary' has no attribute 'pd'
为公平起见,pd
在那儿,只是藏在MyLibrary.modules.MyModule1.pd
的更下方。但是话又说回来,pandas
到处都有numpy
。它位于pd.core.reshape.concat.np
,pd.core.reshape.merge.np
,pd.core.common.np
中,几乎每个文件都无法避免。
答案 1 :(得分:0)