【发布时间】:2018-08-01 17:56:02
【问题描述】:
鉴于下面的代码,我试图识别发送给类使用的装饰器的参数。
具体来说,我正在尝试识别传递给make_hyper 装饰器的值100,该装饰器在Dog 类中使用。
理想情况下,我需要能够在不直接运行该方法的情况下获得该值,因为我正在使用的实际方法代码需要很长时间才能运行。
import inspect
def make_hyper(new_volume):
def decorator(decorated_method):
def wrapped_method(self, *args, **kwargs):
self.volume = new_volume
return decorated_method(self, *args, **kwargs)
return wrapped_method
return decorator
class Dog(object):
def __init__(self, name):
self.name = name
self.volume = 1
@make_hyper(new_volume=100)
def bark(self):
if self.volume >= 10:
print('[{}]: BARK!!'.format(self.name))
elif self.volume >= 5:
print('[{}]: Bark!'.format(self.name))
else:
print('[{}]: Bark'.format(self.name))
我尝试使用 inspect.getargspec 和其他一些东西,并且(尽我所能)搜索 Stackoverflow 和整个互联网,但我找不到解决方案。
任何帮助将不胜感激!感谢您的宝贵时间!
更新: 有人要求我澄清我想要做什么。抱歉没有更清楚。
上述玩具所代表的实际代码是一个测试自动化框架,其中包括指定测试标签的装饰器:
class TestTags(object):
WIFI = 'wifi'
BLE = 'ble'
NIGHTLY = 'nightly'
REGRESSION = 'regression'
class TestBase(unittest.TestCase):
<define common test stuff and test decorators>
class ThingTester(TestBase):
@TestBase.tags(TestTags.WIFI, TestTags.BLE, TestTags.REGRESSION)
def test_all_the_things(self):
<test all the things>
# what I'm trying to get
test_tags = ???
print(test_tags) # prints out ('wifi', 'ble', 'regression')
我编写了一个实用程序,它遍历所有测试模块、类和单个测试,并创建一个定义测试计划的 HTML+JavaScript 页面。我要添加到页面的一条数据是与每个测试相关联的标签。
我发现我可以让tags 装饰器将属性保存到类(即self.tags = tags),但这需要在将值保存到TestBase 对象之前运行测试,我需要能够独立于运行测试生成测试计划。
【问题讨论】:
-
你没有展示你期望如何获取和使用装饰器的参数值,而不是通常在装饰器自己的体内。你能澄清一下你正在尝试做什么并且没有工作吗?