如何从函数中获取属性和运算符

时间:2014-11-14 15:27:08

标签: python

有没有办法如何使用下标文字:

['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()),就像没有任何必要的打印一样。

2 个答案:

答案 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