Можно ли расширить класс из __init__.py - PullRequest
1 голос
/ 06 ноября 2019

Я написал небольшой пакет на python, который расширяет информационный фрейм pandas несколькими дополнительными методами.

На данный момент у меня есть этот код в моем пакете:

def init():
    @pd.api.extensions.register_dataframe_accessor("test")
    class _:
        def __init__(self, pandas_obj):
            self._obj = pandas_obj

        def myMethod(self):
            pass

Затем я делаю следующее на python:

import pandas as pd
import mypackage as mp
mp.init()
test = pd.Dataframe(<define data frame>)
test.mp.myMethod()

Мой вопрос, это так? Можно ли импортировать панды и зарегистрировать средство доступа из __init__.py в mypackage, чтобы после импорта mypackage у меня автоматически был доступ к mymethod без шага init ()? Мой нынешний подход кажется немного неуклюжим ...

1 Ответ

2 голосов
/ 06 ноября 2019

Я могу что-то упустить в вашем вопросе, но я думаю, что вы, возможно, лаете не на то дерево. В этом отношении нет ничего особенного в __init__.py - все, что вы пишете в __init__.py, выполняется при импорте пакета, поэтому я не думаю, что вам вообще нужна эта init() функция. Если у вас есть файл, содержащий:

# mypackage/__init__.py
import pandas as pd


@pd.api.extensions.register_dataframe_accessor("test")
class _:
    def __init__(self, pandas_obj):
        self._obj = pandas_obj

    def myMethod(self):
        print(self._obj)

Теперь вы можете просто использовать его, импортировав mypackage как:

>>> import pandas as pd
>>> import mypackage
>>> df = pd.DataFrame({'a': [1, 2, 3]})
>>> df.test.myMethod()
   a
0  1
1  2
2  3

В качестве одной причины, вы можете явно указать хотите что-то вроде вашей init() функции - принцип наименьшего удивления: поскольку register_dataframe_accessor изменяет пространство имен экземпляров DataFrame для всех пользователей (включая другие библиотеки), существует небольшая вероятность того, что ваш register_dataframe_accessor, простоимпортируя ваш пакет, может переопределить некоторые другие компоненты пакета данных, если они случайно имеют одно и то же имя.

Если имя достаточно уникально, это не может быть проблемой. Это также может просто не быть проблемой для вашего пакета в зависимости от того, как он предназначен для использования.

...