Почему «self» не определено для оценок в понимании Python [дубликат]Python

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

Сообщение Anonymous »

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

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

class Foo:
def bar(self, f):
print(f"bar {f}")
def baz(self, f):
print(f"baz {f*2}")
def bear(self, f):
print(f"bear {f**2}")

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

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

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

class MyTest(unittest.TestCase):
def setUp(self):
self.foo = build_wrapped_foo()
self.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

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

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

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

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

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

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

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