Как получить имя файла подкласса? - PullRequest
0 голосов
/ 10 января 2019

Как получить имя файла подкласса?

Пример:

base.py:

class BaseClass:
    def __init__(self):
        # How to get the path "./main1.py"?

main1.py:

from base import BaseClass

class MainClass1(BaseClass):
    pass

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Вы могли бы сделать это, дойдя назад через стек вызовов, чтобы получить глобальное пространство имен вызывающего метода BaseClass.__init__(), и из этого вы можете извлечь имя файла, в котором он находится, используя значение __file__ введите его.

Вот что я имею в виду:

base.py

import sys

class BaseClass(object):
    def __init__(self):
        print('In BaseClass.__init__()')
        callers_path = sys._getframe(1).f_globals['__file__']
        print('  callers_path:', callers_path)

main1.py:

from base import BaseClass

class MainClass1(BaseClass):
    def __init(self):
        super().__init__()

mainclass1 = MainClass1()

Пример выходных данных работы main1.py:

In BaseClass.__init__()
  callers_path: the\path\to\main1.py
0 голосов
/ 11 января 2019

Помните, что self в BaseClass.__init__ является экземпляром фактического класса, который инициализируется. Поэтому одно из решений - спросить этот класс, из какого модуля он пришел, а затем указать путь к этому модулю:

import importlib

class BaseClass:
    def __init__(self):
        m = importlib.import_module(self.__module__)
        print m.__file__

Я думаю, что, возможно, есть несколько способов получить модуль, который вы не можете импортировать; это не самое надежное решение.

Если все, что вы пытаетесь сделать, это определить, откуда взялся подкласс, то, вероятно, достаточно объединить имя модуля и имя класса, поскольку должно однозначно идентифицировать его:

class BaseClass:
    def __init__(self):
        print "{}.{}".format(
            self.__module__,
            self.__class__.__name__
        )
0 голосов
/ 10 января 2019

Я думаю, что вы ищете неправильный механизм для вашего решения. Ваши комментарии предполагают, что вам нужен обработчик исключений с минимальной возможностью обратного отслеживания. Это не то, что легко обрабатывается в общем механизме class.

Скорее, вы должны изучить возможности проверки стека Python. Очень просто, вы хотите, чтобы ваш __init__ метод сообщал имя файла вызывающего подкласса. Вы можете добиться этого, потребовав, чтобы вызывающая сторона передала свое собственное значение __file__. В автоматическом режиме вы можете откопать один кадр стека и получить доступ к __file__ через эту контекстную запись. Обратите внимание, что этот подход предполагает , что вам нужна только эта информация, когда __init__ вызывается непосредственно из метода подкласса.

Этого достаточно, чтобы получить правильную документацию?

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