Как я могу сохранить или идентифицировать кадр стека вызывающего абонента? - PullRequest
0 голосов
/ 14 февраля 2010

Мой мозг сегодня чувствует себя медленно.

Я пишу пре / пост / инварианты в Python, используя декораторы. В настоящее время мне нужно каждый вызов, чтобы указать локальные и глобальные для контекста, и это выглядит ужасно. Есть ли способ получить локальные и глобальные переменные уровня приложения-декоратора, даже если это произвольная глубина?

То есть я пытаюсь сделать этот уродливый код: из dectools импорт инвариант, pre, post, call_if

@invariant("self.price >= 0 and self.inventory >= 0 and Item.tax_rate >= 0")
class Item(object):
    tax_rate = 0.10  # California.  No property taxes on old property.

    @post("ItemDB.fetch(self) = (name, price)", locals(), globals())
    def __init__(self, name, price):
        self.name = name
        self.price = price
        self.total_sold = 0
        self.inventory = 0

    @call_if(check_level, "manager")
    @post("self.total_sold > 0", locals(), globals())
    @pre("discount > 0 and discount <= self.price * 0.50", locals(), globals())
    def adjust_price(self, adjustment):
         ....

в тот же уродливый код без всех "locals (), globals ()". Я сталкиваюсь с проблемами, когда вложенные декораторы дают мне произвольную глубину стека, поэтому моя реализация dectools.pre не может получить с постоянной глубины sys._getframe (). Я не очень много играл со стеком, и был бы признателен, если у кого-то есть хитрость. (Да, я взламываю локальные переменные в локальные, предполагая, что self будет в правильном кадре стека. Это Item.tax_rate, которое всегда выходит за рамки, и self, и ItemDB.)

Заранее спасибо,

Чарльз

1 Ответ

2 голосов
/ 14 февраля 2010

Если вы можете получить доступ к self.total_sold, вы можете получить доступ к self.tax_rate (это то же самое, что и Item.tax_rate, если вы не нажмете на него - так что вы просто не растоптаете его, сохраните налоговую ставку как нетронутая переменная класса и доступ к ней через self.! -). Это было бы на намного более надежным, чем копирование в стеке, особенно с вложенными декораторами на рисунке, что более или менее гарантирует хрупкий код, зависящий от конкретной версии (самоанализ стека предназначен для использования в целях отладки по существу, не для производственных целей).

...