创建可共享模块的正确方法(程序包导入)

时间:2019-03-02 00:47:49

标签: python pandas module

我想创建一个可以与他人共享的模块,但是我对此还很陌生,并且在整理它以供他人使用的最后一步中遇到了问题。想象一下,它叫做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导入一样。)

对我来说,这似乎是可怕的做法。那么,加载这些导入的正确方法是什么?

理想情况下,这是可共享的,以便有人可以像安装统计模块那样安装它。如果解决方案只是一种检查以确保以某种方式导入的东西,那我很好。

2 个答案:

答案 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

我们有文件的位置:

__ init __。py

from MyLibrary.modules.api import *

api.py

from MyLibrary.modules.MyModule1 import function_1, function_2

MyModule1.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)

现在我们可以使用这些功能,但是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.nppd.core.reshape.merge.nppd.core.common.np中,几乎每个文件都无法避免。

答案 1 :(得分:0)

请参阅这两篇文章,我认为它们可以为您提供帮助- https://realpython.com/python-modules-packages/ https://realpython.com/absolute-vs-relative-python-imports/