Python元类调试代码本地通过但线上提交失败求助
问题求助:Codewars谜题属性访问监控在线提交失败
我正在解决一道Codewars编程谜题,本地运行解决方案和测试用例均正常,但在线提交时失败,核心问题是属性访问的监控逻辑未生效。以下是我的完整代码,恳请技术支持:
import functools import codewars_test as test class Debugger(object): attribute_accesses = [] method_calls = [] class AttributeAccessDescriptor: def __init__(self, attr_name): self.attr_name = attr_name def __get__(self, instance, owner): if instance is None: return self value = instance.__dict__[self.attr_name] print(f"Attribute '{self.attr_name}' accessed with value: {value}") Debugger.attribute_accesses.append( {'action': 'get', 'class': instance.__class__, 'attribute': self.attr_name, 'value': value } ) return value def __set__(self, instance, value): print(f"Attribute '{self.attr_name}' set with value: {value}") Debugger.attribute_accesses.append( {'action': 'set', 'class': instance.__class__, 'attribute': self.attr_name, 'value': value } ) instance.__dict__[self.attr_name] = value class Meta(type): def __new__(cls, name, bases, attrs): for key, value in attrs.items(): if callable(value): attrs[key] = cls.wrap_method(value) elif not key.startswith("__"): attrs[key] = AttributeAccessDescriptor(key) print(f"__new__: cls = {cls}, name = {name}, bases = {bases}, attrs = {attrs}") return super().__new__(cls, name, bases, attrs) @staticmethod def wrap_method(method): @functools.wraps(method) def wrapped(*args, **kwargs): print(f'method = {method}') if method.__name__ != '__init__': Debugger.attribute_accesses.append( {'action': 'get', 'class': args[0].__class__, 'attribute': method.__name__, } ) Debugger.method_calls.append( {'class': args[0].__class__.__name__, 'method': method.__name__, 'args': args, 'kwargs': kwargs}) return method(*args, **kwargs) return wrapped class Foo(object, metaclass=Meta): x = 0 def __init__(self, x): self.x = x def bar(self, v): return self.x, v a = Foo(1) a.bar(2) print(Debugger.method_calls) print(Debugger.attribute_accesses) calls = Debugger.method_calls test.assert_equals(len(calls), 2) test.describe("Test collected method calls") test.it("Call to init should be collected") test.assert_equals(calls[0]['args'], (a, 1)) test.it("Call to bar should be collected") test.assert_equals(calls[1]['args'], (a, 2)) test.describe("Test collected attribute accesses") accesses = Debugger.attribute_accesses test.assert_equals(len(accesses), 3) test.it("Attribute set in init should be collected") test.assert_equals(accesses[0]['action'], 'set') test.assert_equals(accesses[0]['attribute'], 'x') test.assert_equals(accesses[0]['value'], 1) test.it("Method get should be collected too") test.assert_equals(accesses[1]['action'], 'get') test.assert_equals(accesses[1]['attribute'], 'bar') test.it("Attribute get should be collected") test.assert_equals(accesses[2]['action'], 'get') test.assert_equals(accesses[2]['attribute'], 'x')
内容的提问来源于stack exchange,提问作者Amir Afghani
相关产品推荐
相关产品推荐

