【发布时间】:2017-10-05 12:34:53
【问题描述】:
我不确定这是否是一个难题。我有一个功能,可以说
def load(es , fn_set_your_data , input_file, **kwargs):
success, some_ = bulk(es, fn_set_your_data(input_file, **kwargs))
def fn_index_data( index_name , doc_type , input_file , fn_set_your_data , mapping = False , force = False):
es = Elasticsearch()
if es.indices.exists(index= index_name):
return "Index Already exists"
else:
if mapping:
es.indices.create(index=index_name, body=mapping, ignore=400)
print "Mapping is done"
load(es , fn_set_your_data , input_file , index_name = index_name , doc_type_name = doc_type)
现在有另一个函数接受这个函数作为参数,比如说 global_fn 。我需要将 local_fn 作为参数传递给 global_fn ,参数 split_value 在循环中每次都会改变。例如:
def set_your_data(input_file, index_name , doc_type_name , split_value = 1):
global global_count
for skill_ , items_ in input_file.iteritems():
main_item = items_['main_item'].strip()
main_item_split = main_item.split()
if len(main_item_split) == split_value :
query = {'item' : main_item}
yield {
"_index": index_name,
"_type": doc_type_name,
"_id": global_count,
"_source": query
}
else:
continue
if __name__ == "__main__":
index_name_list = ['percolate_bigram' , 'percolate_ngram' , 'percolate_bigram']
doc_type = 'alert'
for idx, index_name in enumerate(index_name_list):
split_value = idx
fn_index_data(index_name = index_name , doc_type = doc_type , input_file = input_data , fn_set_your_data = set_your_data , mapping = mapping)
##### 我如何将 split_value 传递给 set_your_data (local_fn),然后将其传递给 fn_index_data (global_fn)。希望这段代码给出了一个好的和合理的上下文。
用**kwargs 或其他东西可行吗?
任何 cmets 都会有用。
【问题讨论】:
-
这完全取决于
global_fn。它是什么样子的?它是否接受任何其他可以传递的参数? -
你的
global_fn接受参数吗?如果是,则需要从local_fn返回值 -
看看
functools.partial可能是值得的,但您的描述太模糊,无法确定。 -
@DanielRoseman - 是的,它接受参数。但是,问这个的主要目的是,这种对 local_fn 的自定义修改(在循环中传递参数)是非常罕见的情况。所以,我不想修改 global_fn。但不管怎样,那怎么可能做到。我应该将 split_value 作为可选参数传递给 global_fn 吗?
-
如果允许
global_fn接受更多参数,那么您可以执行global_fn(local_fn, split_value)之类的操作。
标签: python function parameters arguments