Правильный способ создания разделяемого модуля (импорт пакетов) - PullRequest
0 голосов
/ 02 марта 2019

Я хочу создать модуль, которым я поделюсь с другими, однако я довольно новичок в этом и у меня возникли проблемы с последним шагом по приведению его в порядок для других пользователей.Представьте, что это называется что-то вроде 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 голосов
/ 02 марта 2019

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

0 голосов
/ 02 марта 2019

Посмотрите эти две статьи, я думаю, они могут вам помочь- https://realpython.com/python-modules-packages/ https://realpython.com/absolute-vs-relative-python-imports/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...