从robotframework脚本调用一个装饰的python函数,导致无限递归

时间:2016-04-22 07:23:13

标签: python robotframework python-decorators

我试图从robotframework关键字调用python函数。 python函数已经过装饰,可以使用Builtin库中的run_keyword进行调用。这是因为如果通过内置库中的run_keyword函数调用库函数,则机器人日志看起来结构良好。而不是直接调用。然而,这导致无限循环。是否有优雅地实现目标的解决方案?

robotkeyword :

do something
#creates a user by calling a function from python based library
create user

python function
@wrap_with_run_keyword
def create_user():
    pass

def wrap_with_run_keyword(func):
    def func_wrapper(*args, **kwargs):
        return run_keyword(func, *args, **kwargs)
    return func_wrapper

我无法使用部分应用来解决问题。

但是,我通过设置和取消设置属性来代理递归循环,如下所示。

def wrap_with_run_keyword(func):
def func_wrapper(*args, **kwargs):
    if not hasattr(func, 'second'):
        setattr(func, "second", True)
        return run_keyword(func, *args, **kwargs)
    else:
        delattr(func, "second")
        return func(*args, **kwargs)

return func_wrapper
然而,我遇到了另一个问题。我将create_user定义如下

def create_user(properties):
    #some code
    pass

On以下面的方式调用此功能

create_user("name=abc")

我收到以下错误:收到了意外的关键字参数' name'

2 个答案:

答案 0 :(得分:1)

我确实遇到了同样的问题,但是解决了它,只是想知道我是否可以检测到调用方...如果调用是通过robotframework或python完成的,则在调用由rf完成的情况下,它应该只执行第二个电话

    @wraps(function)
    def wrapper(self, *args, **kwargs):

        if not hasattr(function, 'second'):
            setattr(function, 'second', True)
            ar= list(args)
            for key, value in kwargs.items():                    
                ar.append(value)     
            return BuiltIn().run_keyword('Mylib.' + function.__name__, ar)
        else:
            delattr(function, 'second')
            return function(self,*args[0])
    return wrapper

答案 1 :(得分:-2)

查看functools模块中的partial类。我想这可能会对你有帮助。

take a look at how decorators work in python