Доступ к функциональной переменной вне функции без использования `global` - программирование
Подтвердить что ты не робот

Доступ к функциональной переменной вне функции без использования `global`

Я пытаюсь получить доступ к локальной переменной функции за пределами функции в Python. Так, например,

bye = ''
def hi():
    global bye
    something
    something
    bye = 5
    sigh = 10

hi()
print bye

Вышеизложенное прекрасно работает. Поскольку я хочу узнать, могу ли я получить доступ к bye вне hi() без использования global bye, я попробовал:

def hi():
    something
    something
    bye = 5 
    sigh = 10
    return

hi()
x = hi()
print x.bye 

Вышеприведенное дает AttributeError: 'NoneType' object has no attribute 'bye'.

Затем я попытался:

def hi():
    something
    something
    bye = 5
    sigh = 10
    return bye 
hi()
x = hi()
print x.bye

На этот раз это не дает даже ошибки.

Итак, есть ли способ доступа к локальной функциональной переменной (bye) вне ее функции (hi()) без использования глобальных переменных и без распечатки переменной sigh? (Вопрос был изменен, чтобы включить sigh после комментария @hcwhsa ниже.

4b9b3361

Ответ 1

Вы могли бы что-то сделать по этим строкам (которые работали как в Python v2.7.14, так и v3.6.3, когда я тестировал его/их):

def hi():
    # other code...
    hi.bye = 42  # Create function attribute.
    sigh = 10

hi()
print(hi.bye)  # -> 42

Функции - это объекты в Python и могут иметь произвольные атрибуты, назначенные им.

Если вы собираетесь часто делать такие вещи, вы можете реализовать нечто более общее, создав декоратор функций, который добавляет аргумент this для каждого вызова декорированной функции. Этот аргумент будет давать функции для ссылки на себя и аналогичен методам класса аргументов экземпляра, которые автоматически получают в качестве первого аргумента, который обычно называется self. Я выбрал имя this, чтобы избежать путаницы. Его можно назвать чем угодно.

Вот пример такого подхода:

def with_this(func):
    def wrapped(*args, **kwargs):
        return func(wrapped, *args, **kwargs)
    return wrapped

@with_this
def hi(this):
    # other code...
    this.bye = 42  # Create function attribute.
    sigh = 10

hi()
print(hi.bye)  # -> 42

Ответ 2

Проблема заключается в том, что вы вызывали print x.bye после того, как вы установили x в качестве строки. Когда вы запускаете x = hi(), он запускает hi() и устанавливает значение x в 5 (значение bye; оно не устанавливает значение x в качестве ссылки на байтовую переменную). EX: bye = 5; x = bye; bye = 4; print x; печатает 5, а не 4

Кроме того, вам не нужно дважды запускать hi(), просто запустите x = hi(), а не hi();x=hi() (так, как вы его запускали hi(), ничего не делали с полученным значением 5, а затем перезапустить один и тот же hi() и сохранить значение 5 переменной x.

Таким образом, полный код должен быть

def hi():
    something
    something
    bye = 5
    return bye 
x = hi()
print x

Если вы хотите вернуть несколько переменных, одним из вариантов будет использование списка или словаря в зависимости от того, что вам нужно.

Пример:

def hi():
    something
    xyz = { 'bye': 7, 'foobar': 8}
    return xyz
x = hi()
print x['bye']

подробнее о словарях python на http://docs.python.org/2/tutorial/datastructures.html#dictionaries

Ответ 3

Вы можете сделать что-то в этом роде:

def static_example():
   if not hasattr(static_example, "static_var"):
       static_example.static_var = 0
   static_example.static_var += 1
   return static_example.static_var

print static_example()
print static_example()
print static_example()

Ответ 4

 def hi():
     bye = 5
     return bye  

print hi()