You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:12:02