Как я могу передать своих местных жителей и получить доступ к переменным непосредственно из другой функции?

Предположим, у меня это:

def a(dict): locals().update(dict) print size def b(): size = 20 f(locals()) 

Что мне нужно сделать, чтобы получить доступ к переменной size непосредственно из функции? Я знаю :

  • Python - передача функции в другую функцию
  • Функции вызова из re.sub
  •  size = dict["size"] 

    но я думаю, что должен быть более прямой путь. Я пробовал использовать locals().update(dict) но это не сработало. Есть ли лучший способ?

  • Python Threads - критический раздел
  • Есть ли эквивалент Python для интерполяции строк Ruby?
  • Функции вызова из re.sub
  • Python - передача функции в другую функцию
  • Определение того, является ли текст английским (навалом)
  • 4 Solutions collect form web for “Как я могу передать своих местных жителей и получить доступ к переменным непосредственно из другой функции?”

    Компилятор Python оптимизирует доступ к локальным переменным путем распознавания во время компиляции, являются ли вызовы, к которым обращается функция, являются локальными (т. Е. Именами, назначенными или иным образом связанными с функцией). Поэтому, если вы код:

     def lv1(d): locals().update(d) print zap 

    компилятор «знает», что barename zap является локальным (не назначается в функции lv1 ), и поэтому он компилирует код для доступа к нему как к глобальному, а не независимо от того, что содержит d .

    Если вы предпочитаете медленный и раздутый код, вы можете победить оптимизацию с помощью exec внутри функции – когда компилятор видит ключевое слово exec , он ЗНАЕТ, что вы пытаетесь сделать ваш код медленным, раздутым и глючным, насколько это возможно, и поэтому он сотрудничает, не оптимизируя никоим образом.

    Таким образом, следующий код работает по вашему желанию:

     def lv1(d): exec "" locals().update(d) print zap lv1({'zap': 23}) 

    он испускает 23 как вы хотите.

    Я надеюсь, что из вышеизложенного «невозмутимого юмора» ясно, что техника не рекомендуется, но я бы лучше ее прописал очень четко: за сомнительное синтаксическое удовольствие от написания print zap вместо вместо локальных print locals()['zap'] , вы платите здоровую цену с точки зрения производительности. Тем не менее, как и всевозможные опасные инструменты, которые могут быть полезны в редких случаях для действительно опытных программистов на уровне гуру, которые действительно действительно знают, что они делают, и почему, exec существует, вы можете использовать (или неправильно использовать) по вашей прихоти: Python НЕ стоит на вашем пути! -)

    Это вам как-то помогает?

     def print_size(size=None): print(size) dict = {'size': 'XXL'} print_size(**dict) 

    Вы можете использовать блокировки для доступа к сфере действия другой функции:

     def b(): def a(): print size size = 20 a() 

    Хитрость состоит в том, чтобы стекировать функции, которые принадлежат друг другу друг другу. Таким образом, внутренняя функция a может обращаться к локальным переменным внешней функции b.

    Но я не знаю, что вы на самом деле, поэтому я не уверен, что это помогает.

     print size 

    не может работать, потому что «размер» неизвестен при компиляции кода. Ваш код будет работать, если вы измените его следующим образом:

     def a(dict): locals().update(dict) print locals()["size"] def b(): size = 20 a(locals()) 

    Но поскольку комментарий к вашему вопросу уже предлагает: Это очень странный код. Я очень уверен, что есть лучшие решения, если вы объясните, что вы действительно хотите сделать.

    Python - лучший язык программирования в мире.