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