2016-04-22 48 views
0

我试图从robotframework关键字调用python函数。 python函数已被修饰为使用Builtin库中的run_keyword进行调用。这是因为机器人日志显示结构良好,如果库函数是通过内置库中的run_keyword函数调用的。而不是直接调用。但是这会导致无限循环。有没有一个解决方案来优雅地完成目标?从robotframework脚本调用装饰的python函数导致无限递归

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 

在调用下面

create_user("name=abc") 

的方式这个功能,我发现了以下错误:得到了一个意想不到的关键字参数“名”

+0

为什么在调用关键字“创建用户”时调用关键字“创建用户”?你已经创建了一个自己调用的关键字。您是否打算创建一个_new_关键字,从其他库中调用_an existing_关键字? “结构良好”是什么意思?如果您通过“run keyword”直接调用关键字,那么在日志中应该没有区别,除非在后一种情况下您有一个额外的嵌套级别。 –

+0

@BryanOakley日志的形成方式有所不同。如果你从机器人调用库关键字,它看起来很好嵌套。但是,如果您的图书馆进一步调用另一个函数/关键字,它会在同一级别平坦。但是,如果您通过运行关键字从另一个库调用另一个库函数,则嵌套也会出现在树中的某种树中,使其更具可读性。 – decoder

回答

-2

看看在functools模块的partial类中。我认为这可能会帮助你。

take a look at how decorators work in python

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/12108573) – Oz123

+0

我明白了。我会牢记这一点 – salomonderossi