我试图从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'
答案 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
类。我想这可能会对你有帮助。