Как найти имя файла вызывающей функции "как можно быстрее" в Python 3 - PullRequest
0 голосов
/ 02 октября 2019

Например, вот файловая структура.

    folder
      | - Modules
      |  |  -  b.py
      | - a.py

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

Как вы делаете этот процесс "как можно быстрее"? (при условии, что ваша целевая продукция: a.py)


В настоящее время я делаю inspect.stack()[1][1] и разделяю полученную строку с .split("folder")[-1], но я считаю, что это слишком медленно. (1/2 секунды)

Я также попытался os.path.realpath(__file__) и inspect.getfile(inspect.currentframe()), но пришел к выводу, что обе функции возвращают файл, в котором находится функция (b.py), а не файлв котором находится вызывающий абонент* и what_i_want(frame) не являются реальными функциями, а представляют собой просто некоторый текст-заполнитель для того, что «должно» быть там

b.py:

import sys, inspect, os

def test1():
    return inspect.getfile(inspect.currentframe())

def test2():
    return inspect.stack(0)[1][1]

def test3():
    return os.path.realpath(__file__)

a.py:

from Modules.b import *

def caller_function():
    test1()  #input either test1(), test2(), or test3()


print(caller_function())

Я ожидаю, что консоль напечатает ... folder / a.py, и test2 сделает это, но вывод из test1() и test3() будет ... folder / Modules / b.py (что довольноочень ожидаемый для test3(), но необычный для test2()

...