программно определить, присваивается ли оценка функции? - PullRequest
1 голос
/ 13 ноября 2009

Я хотел бы сделать это:

def foo():
    if <a magical condition>:
        return x
    else:
        poof()

# or...
def foo():
    x = <a magical object>
    return x

def poof():
    print 'poof!'

bar = foo()  # bar points to <a magical object> but poof() is not called

foo() # prints 'poof!'

Я полагаю, что все сводится к тому, каковы обстоятельства, когда вызывается метод __del__ возвращаемого объекта. Но, может быть, есть лучший способ. Например, если бы сама функция знала, что ей присваивается возвращаемое значение. Я думаю, я беспокоюсь о том, чтобы полагаться на время сбора мусора. Также мне не нравится этот глобальный флаг at_end_of_program.

Мое решение:

class Magic:
    def __del__(s):
        poof()

def foo():
    x = Magic()
    return x

def poof():
    if not at_end_of_program:
        print 'poof!'

bar = foo()  # No poof.

foo() # prints 'poof!'

Ответы [ 2 ]

3 голосов
/ 13 ноября 2009

Меня довольно смущает ваш вопрос, но я думаю, что вы пытаетесь сделать, это запустить функцию, когда значение переназначено.

Вместо того, чтобы делать сложные вещи с помощью функции метода __del__(), я предлагаю вам просто поместить свое значение в экземпляр класса, а затем перегрузить __setattr__(). Вы также можете перегрузить __delattr__(), чтобы убедиться, что вы поймали del(object.x) для вашего значения x.

Сама цель __setattr__() состоит в том, чтобы дать вам возможность ловить ловушку, когда что-то присваивается члену вашего класса. И вам не понадобится какой-либо странный флаг end_of_program. В конце вашей программы просто избавьтесь от перегруженной функции для __delattr__(), чтобы не вызывать ее для очистки в конце программы.

1 голос
/ 13 ноября 2009

Функция не может сказать, для чего используется ее возвращаемое значение. Ваше решение напечатает poof, если вы переназначите, например, bar.

Какую реальную проблему вы пытаетесь решить?

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