有没有办法如何使用下标文字:
['TAG1'], [==], [100]
来自功能:
verify_state('TAG1') == 100)
在这个函数里面,还是在装饰函数里面?
让我说明我的意思:
# decorator func
def printer(function):
@functools.wraps(function)
# wrapper
def wrapper(*args, **kwargs):
print ('Verify that tag {0} {1} {2}'.format(value1, operator, value2))
# output will be like:
# Verify that tag TAG1 == 100
# No we have to call func, that will get information about value of TAG1
# will be for example 115.5
value1 = get_tag_value('TAG1')
# and now compare results
# compare(value1 [operator] value2)
# in this case:
# compare(115.5 == 100)
# which will fail, but that not that important.
return result
return wrapper
@printer
def a(x):
return x
最后,我想称之为这个功能:
a(('TAG1') == 100)
有可能吗?
我发现隐藏的功能为__eq__
,等于'等我可以重新编码,
但这不是我需要的。我不需要在已经发明自行车的情况下重新发明自行车"如果你知道我的意思..
我只需要提取这些值,将它们打印到日志中,然后继续执行功能(a()
),就像没有任何必要的打印一样。
答案 0 :(得分:0)
您可以使用操作员模块https://docs.python.org/2/library/operator.html,然后创建一个功能,可以使用您的标签,操作员和右手,并以此方式进行检查。例如,
import operator
def check_state(tag, operator, right_hand):
value1 = get_value(tag)
return operator(value1, right_hand)
check_state("Tag1", operator.eq, 100)
答案 1 :(得分:0)
我会假设你想要的是装饰verify_state
:
>>> verify_state('TAG1') == 100
Verify that tag 'TAG1' == 100
True # or False or whatever
在这种情况下,简短的回答是否。 verify_state
对所返回的值所做的事情一无所知,装饰者只能访问'TAG1'
。
或者,如果你的意思是附加功能:
>>> some_func(verify_state('TAG1') == 100)
Verify that tag 'TAG1' == 100
True # or False or whatever
然后答案仍然是否,因为操作的顺序是有效的:
>>> arg = verify_state('TAG1') == 100
>>> some_func(arg)
即。在调用函数之前计算表达式。
可以做的事情有:
>>> import operator # get access to operators
>>> PLAINTEXT = {operator.eq: "=="} # map operators to text
>>> def printer(val1, op, val2): # new function to print and evaluate
print("Verify that {!r} {} {!r}".format(val1, PLAINTEXT[op], val2))
return op(val1, val2)
>>> printer(42, operator.eq, 'foo')
Verify that 42 == 'foo'
False
然而,再次,如果你打电话,例如printer(verify_state('TAG1'), operator.eq, 100)
,verify_state
的来电将在调用printer
之前进行评估,因此您最终会得到例如。
>>> printer(verify_state('TAG1'), operator.eq, 100)
Verify that 100 == 100
True
这可能并不十分有用。
要解决这个问题,您可以在以下位置添加装饰器:
>>> def verbose(func):
def wrapper(*args, **kwargs):
print("Calling: {}(*{!r}, **{!r})".format(func.__name__,
args, kwargs))
result = func(*args, **kwargs)
print("Call returned: {!r}".format(result))
return result
return wrapper
>>> @verbose
def verify_state(tag):
return 100
>>> printer(verify_state('TAG1'), operator.eq, 100)
Calling: verify_state(*('TAG1',), **{})
Call returned: 100
Verify that 100 == 100
True