Мой мозг сегодня чувствует себя медленно.
Я пишу пре / пост / инварианты в 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.)
Заранее спасибо,
Чарльз