【问题标题】:Passing an argument to the function , which has to be passed as an argument to another function in python将参数传递给函数,该函数必须作为参数传递给python中的另一个函数
【发布时间】: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


【解决方案1】:
def set_your_data(split_value=1):
    def set_your_data_inner(input_file, index_name , doc_type_name):
        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
    return set_your_data_inner

if __name__ == "__main__":

    index_name_list = ['percolate_bigram' , 'percolate_ngram' , 'percolate_bigram']
    doc_type   = 'alert'


    for idx, index_name in enumerate(index_name_list):
        fn_index_data(index_name  = index_name , doc_type = doc_type , input_file = input_data , fn_set_your_data = set_your_data(idx) , mapping = mapping)

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 2021-04-13
    • 2013-01-27
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多