2017-05-10 14 views
0

私は次のサンプルブロックのコードを持っています。ここでは、ある言語のテキストを別の言語に翻訳しようとしています。私は翻訳したいターゲット言語を表す追加の引数を渡すことができる必要があります。pythonコールバックに追加のパラメータを渡すには?

コールバックの引数のリストに別の引数を追加するにはどうすればいいですか?boltons.iterutils.remap

remapコールでは**kwargsを使用している可能性がありますが、そうでないと思われます。 TypeErrorが発生します。

raise TypeError('unexpected keyword arguments: %r' % kwargs.keys()) 

ご協力いただければ幸いです。

import json 
from boltons.iterutils import remap 

def visit(path, key, value, lang='es'): 
    if value is None or value == '' or not isinstance(value, str): 
     return key, value 
    return key, '{}:{}'.format(lang, value) 

if __name__ == '__main__': 
    test_dict = { 'a': 'This is text', 'b': { 'c': 'This is more text', 'd': 'Another string' }, 'e': [ 'String A', 'String B', 'String C' ], 'f': 13, 'g': True, 'h': 34.4} 
    print(remap(test_dict, visit=visit, lang='ru')) 
+0

この 'boltons.iterutils.remap'にはコールバックに渡す追加パラメータがありますか? – tdelaney

答えて

1

どうやらboltons.iterutils.remapは、そのコールバックに追加のキーワードパラメータを渡さない - と1は実際にそれを期待していません。したがって、visitに直接電話することはできません。ただし、値を入力する別の関数を呼び出すことはできます。これは、lambdaの良いユースケースです。

import json 
from boltons.iterutils import remap 

def visit(path, key, value, lang='es'): 
    if value is None or value == '' or not isinstance(value, str): 
     return key, value 
    return key, '{}:{}'.format(lang, value) 

if __name__ == '__main__': 
    test_dict = { 'a': 'This is text', 'b': { 'c': 'This is more text', 'd': 'Another string' }, 'e': [ 'String A', 'String B', 'String C' ], 'f': 13, 'g': True, 'h': 34.4} 
    print(remap(test_dict, visit=lambda key, value: visit(key, value, lang='ru'))) 
+0

素晴らしいアイデア。ラムダ関数をいつ適用するかはまだ分かっているので、私には起こりませんでした。 –

+0

あなたは通常の関数 'def foo(key、value)と同じことをすることができます:return visit(key、value、lang = 'ru')' - これは 'lambda'が適合した時関数名を考える必要はありません。 – tdelaney

関連する問題