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

Python 创建可共享模块的正确方法(包导入),python,pandas,module,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.funct

我想创建一个模块,我将与其他人共享,但我对这一点非常陌生,并且在最后一步整理它以供他人使用时遇到了问题。假设它被称为类似于
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)
等等。但是,如果我确实导入了我的\u模块,则自动完成中也会出现
我的\u模块.pd
(与导入
我的\u模块.py
一样)

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


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

请看这两篇文章,我认为它们可以帮助您-
你所做的事情没有本质上的错误。您的模块需要
熊猫
,因此必须导入它。PEP8指定导入应位于顶部,而不是嵌套在函数中。这样做将在导入my_模块时将其添加为属性。因为您是在
熊猫
的基础上构建的,所以您不能只共享模块,还需要共享
熊猫
(或者检查它们是否已经安装了正确或足够版本的
熊猫

尽管如此,当您有一个只使用
DataFrame
类的函数时,导入整个
pandas
库可能有些过分。在这种情况下,您可以执行以下操作:

from pandas import DataFrame

def function_1(a,b):
    return a*b

def function_2(c,d):
    return DataFrame(data=c,columns=d)
现在,
myu模块
将只附加
.DataFrame
类,而不是整个
pandas
库。如果您确实在模块中使用了越来越多的
pandas
库,那么导入单独的部分会更麻烦,所以只需导入
pandas

以熊猫为例,它是建立在numpy的基础上的。每个数据帧的底层都是一个
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
=====
我们有文件的地方:

__初始值 api.py MyModule1.py 现在我们可以访问这些函数,但不再有
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.reforme.concat.np
pd.core.reforme.merge.np
pd.core.common.np
和几乎所有文件中,您无法避免它

这真的很好,虽然看起来很鬼鬼祟祟,但确实有效。编写专业类型统计包以在代码中隐藏导入的人是否认为这是最佳做法?@LucasH不确定最佳做法,但这似乎是如何组织代码的决定,至少在我的理解水平上是如此。这样做有很多好处,即所有内容都在一个名称下
MyLibrary
,而不需要
将Module1导入为mod1
将Module2导入为mod2
,并且您可以精确控制在第一级属性中附加的函数。所有的东西都始终在那里,但都是嵌套的,这样您就可以拥有更多有组织的属性。
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)
import MyLibrary

MyLibrary.function_2([1], ['a'])
#   a
#0  1

MyLibrary.pd
#AttributeError: module 'MyLibrary' has no attribute 'pd'