Почему «self» не определено для оценок в понимании PythonPython

Программы на Python
Ответить
Anonymous
 Почему «self» не определено для оценок в понимании Python

Сообщение Anonymous »

Чтобы повысить наглядность моего приложения, я вношу исправления в определенные методы объекта, добавляя операторы протоколирования перед вызовом метода:

Код: Выделить всё

def wrapper(original_method):
def wrapped_method(*args, **kwargs):
logging.info(args)
return original_method(*args, **kwargs)
return wrapped_method

foo.bar = wrapper(foo.bar)
foo.baz = wrapper(foo.baz)
foo.bear = wrapper(foo.bear)
При написании модульных тестов я решил сделать их более общими, чтобы мне не приходилось забывать добавлять новые тесты для любых методов, которые я могу исправить в будущем:

Код: Выделить всё

wrapped_funcs = [
attr for attr in dir(self.foo)
if isinstance(eval(f"self.foo.{attr}", {"self": self}), types.FunctionType)
] # Non-monkey-patched methods are types.MethodType

for func in wrapped_funcs:
with patch("logging.info") as mocked_logger:
eval(f"self.foo.{func}('bar')")
mocked_logger.assert_called_once()
Первый eval имеет {"self": self, потому что без него я получаю NameError: имя 'self' не определено, но второй eval определяет в этом нет необходимости.
Итак, мой вопрос: почему eval имеет доступ к себе из цикла for, но не из понимания списка? Область видимости будет одинаковой для обоих вызовов.

Подробнее здесь: https://stackoverflow.com/questions/792 ... rehensions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»