2016-04-22 4 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("name=abc") 

以下の方法で、この関数を呼び出すには

def create_user(properties): 
    #some code 
    pass 

を次のように私はCREATE_USERを定義します。予期しないキーワード引数「名前」

+0

キーワード「create user」を呼び出すと、なぜ「create user」というキーワードが呼び出されますか?自分自身を呼び出すキーワードを作成しました。他のライブラリから_an existing_キーワードを呼び出す_new_キーワードを作成しようとしていますか?そして、「よく構造化された」とはどういう意味ですか?後者のケースでは、1つの特別なレベルの入れ子を除いて、キーワードを直接「キーワード実行」で呼び出すと、ログに違いはありません。 –

+0

@BryanOakleyログの形成方法に違いがあります。ロボットからライブラリキーワードを呼び出すと、ネストされたように見えます。しかし、ライブラリがさらに別の関数/キーワードを呼び出すと、同じレベルでフラットに見えます。しかし、runキーワードを使用して別のライブラリ関数を呼び出すと、ネストはツリー構造のログにも表示され、読みやすくなります。 – decoder

答えて

-2

を見てみましょうを得ましたfunctoolsモジュールのpartialクラスにあります。私はこれがあなたを助けるかもしれないと思う。

またはtake a look at how decorators work in pythonです。

+0

このリンクは質問に答えるかもしれませんが、ここでは答えの重要な部分を含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 12108573) – Oz123

+0

が表示されます。私はそれを念頭に置いておきます – salomonderossi

関連する問題