Код: Выделить всё
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()
code>, но второму eval это не нужно.
Поэтому мой вопрос: почему eval имеет доступ к себе из цикла for, но не из понимания списка ? Кажется, что область действия одинакова для обоих вызовов.
Изменить: добавлен дополнительный код для тех, кто хочет попробовать это локально. Я использую Python 3.11.
Подробнее здесь: https://stackoverflow.com/questions/792 ... rehensions
Мобильная версия