Как имитировать атрибут C # в Python

#c# #python #unit-testing

#python #c# #модульное тестирование #атрибуты

Вопрос:

Недавно я хочу имитировать атрибут C # в python для своих модульных тестовых примеров.

 class SmokeTest(unittest.TestCase):
    @Tags(Tags.BVT)
    @TestCategory('login')
    def test_login(self):
        pass
  

Если все в порядке, я мог бы написать тестовый запуск для поиска тестовых примеров с этими атрибутами (например, я хочу запускать все тестовые примеры с логином категории). После долгих размышлений я получил следующий ответ

 class Attribute(object):
    '''
    To simulate `attribute` in C#
    '''
    def __call__(self, f):
        def wrapper(this, *args, **kwargs):
            return f(this, *args, **kwargs)
        try:
            wrapper._attributes = f._attributes
            wrapper._attributes.append(self)
        except:
            wrapper._attributes = [self]
        return wrapper

class TestCategory(Attribute):
    '''
    Class used to specify the category of a unit test
    '''
    def __init__(self, name):
        self._name = name

    @property
    def Name(self):
        return self._name
  

Реализация проста, просто добавьте свойство ‘_attributes’ для функций, чтобы хранить все атрибуты. Однако это выглядит несколько уродливо!

Мой вопрос в том, есть ли какое-либо лучшее решение?

Комментарии:

1. К вашему сведению, для добавления к атрибутам функции (в смысле OO) подобным образом вам не нужна оболочка. Просто создайте f._attributes , если его там нет, и добавьте к нему.

2. Привет, Делнан, ты прав, оболочка избыточна.