Нет ничего плохого в том, что вы делаете.Для вашего модуля требуется 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.np
, pd.core.reshape.merge.np
, pd.core.common.np
и практически в каждом файле, вы не можете избежать этого.