Есть ли способ получить доступ к переменной из вызывающей функции в Python? - PullRequest
0 голосов
/ 24 октября 2019

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

Я играл с global()и inspect но у меня возникают проблемы при попытке получить атрибут.

Вот что я пытаюсь сделать:


class Example:
    @staticmethod
    def query(**kwargs):
        print(f.read())


with open(__file__) as f:
    Example.query(foo='bar')

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Вот MCVE того, что вы пытаетесь сделать.

class Example:
    @staticmethod
    def query(**kwargs):
        print(f.read())


with open(__file__) as f:
    Example.query(foo='bar')

Работает как положено.

0 голосов
/ 24 октября 2019

Итак, через некоторое время назад и вперед я наконец нашел решение своей проблемы.

Поскольку Matthias предложил использовать глобальный поиск объекта, я решил использовать inspect, чтобы добавить его сам, например:Итак:

Назначение

def __enter__(self):
    inspect.stack()[1][0].f_globals["_ExampleName"] = self

Извлечение (исправлено)

    @staticmethod
    def _find_example():
        stack = inspect.stack()
        for stack_index in range(2, len(stack)):
            stack_globals = inspect.stack()[stack_index][0].f_globals
            if "_ExampleName" in stack_globals.keys():
                return stack_globals["_ExampleName"]

Это немного «хитроумно», так как проверка не предназначена для использования в производственной среде, Однако работает и решает мою проблему

0 голосов
/ 24 октября 2019

Что вы должны сделать, это установить класс Client для переменной класса для текущего сеанса.

class Client:

    last_session = None

    def Session():
        # code that creates new session, in variable s
        Client.last_session = s
        return s

client = Client()
with client.Session as s:
    Example.query(foo=bar)

Class Example:

    @staticmethod
    def query(**kwargs):
        s = Client.last_session
        s.magic_stuff()
...