Как я могу динамически узнать имя пакета подкласса в Python? - PullRequest
1 голос
/ 26 апреля 2020

Для контекста я пишу библиотеку, которая использует Django ORM. Я не хочу, чтобы пользователи моей библиотеки определяли app_label каждый раз, когда они подклассируют мой пользовательский суперкласс Model, вместо этого я хочу применить стандартную структуру для проектов, созданных с ее помощью, которая гарантирует, что имя пакета каждого класса что подклассы моего Model суперкласса будут равны app_label. Вот код, который у меня сейчас есть:

class Model(django.db.models.Model):
    class Meta:
        abstract = True

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        # package_name = ???
        cls._meta.app_label = package_name

Часть ??? - это то, что я не могу понять. Есть идеи?

1 Ответ

0 голосов
/ 26 апреля 2020

Я нашел ответ на мой вопрос по несколько другому вопросу здесь, на SO . Вот как я это реализовал:

class Model(django.db.models.Model):
    class Meta:
        abstract = True

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        mod = inspect.getmodule(cls)
        base, _sep, _stem = mod.__name__.partition('.')
        cls._meta.app_label = base

В качестве альтернативы, это также должно работать:

class Model(django.db.models.Model):
    class Meta:
        abstract = True

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        mod = inspect.getmodule(cls)
        cls._meta.app_label = mod.__package__.split('.')[-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...