Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在调用函数后获取命名参数的顺序_Python_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Python,elasticsearch" /> elasticsearch,Python,elasticsearch" />

Python 如何在调用函数后获取命名参数的顺序

Python 如何在调用函数后获取命名参数的顺序,python,elasticsearch,Python,elasticsearch,我有一个带命名参数的函数 def sample(a=None, b=None, c=None) pass class ESQuery(object): def __init__(self, url, index): pass def filter(self, _bool=None, _range=None, _not=None, _and=None, _or=None, _type=None, exists=None, query=None):

我有一个带命名参数的函数

def sample(a=None, b=None, c=None)
    pass
class ESQuery(object):
    def __init__(self, url, index):
        pass

    def filter(self, _bool=None, _range=None, _not=None, _and=None, _or=None, _type=None, exists=None, query=None):
        return self.query_body
调用函数后如何获取这些参数的顺序

sample(b=1, a=1, c=1)
out: ['b', 'a', 'c']

sample(c=1, a=1)
out: ['c', 'a']

sample(a=1, b=1)
out: ['a', 'b']

sample(b=1, a=1)
out: ['b', 'a']

sample(a=1, b=1, c=1)
out: ['a', 'b', 'c']
也许这可以用装饰师或者其他方法来完成

更新:

我想通过命名参数为elasticsearch过滤器(如sqlalchemy过滤器)制作包装

def sample(a=None, b=None, c=None)
    pass
class ESQuery(object):
    def __init__(self, url, index):
        pass

    def filter(self, _bool=None, _range=None, _not=None, _and=None, _or=None, _type=None, exists=None, query=None):
        return self.query_body
调用函数后,我需要获得正确的查询顺序,如下所示

我只是无法构建查询,以保持严格的顺序

es = Someclass(url, index)
es.filter()
我想使用命名参数来完成这项工作,人们觉得使用命名参数作为工具提示很方便

更新2:

我想换一种方式,一条电话线是不够的,因为可能会有长途电话

from api.search_api import ESQuery
es = ESQuery(index='lot', place='etsy_spider', match_all=True)
print es.\
    filter(query='{ "tweet": "full text search" }').\
    filter(_range='{ "created": { "gte": "now - 1d / d" }}').\
    filter(should='{ "term": { "featured": true }},')

也许有一些关于如何简化elasticsearch中的长查询的想法?

我想不出为什么它会有用。也就是说,您可以使用
inspect
模块():

然后,您将使用正则表达式解析
call\u字符串

请注意,此方法仅适用于单行调用

下面是一个简单的正则表达式解析器,它将按出现顺序返回参数和关键字参数的列表。请注意,这是非常基本的,不适用于包含“,”的字符串


是的,这是可以做到的——继续读下去

调用函数后如何获取这些参数的顺序

sample(b=1, a=1, c=1)
out: ['b', 'a', 'c']

sample(c=1, a=1)
out: ['c', 'a']

sample(a=1, b=1)
out: ['a', 'b']

sample(b=1, a=1)
out: ['b', 'a']

sample(a=1, b=1, c=1)
out: ['a', 'b', 'c']
命名参数作为字典传递,字典的
.items()
定义如下:

调用函数后如何获取这些参数的顺序

sample(b=1, a=1, c=1)
out: ['b', 'a', 'c']

sample(c=1, a=1)
out: ['c', 'a']

sample(a=1, b=1)
out: ['a', 'b']

sample(b=1, a=1)
out: ['b', 'a']

sample(a=1, b=1, c=1)
out: ['a', 'b', 'c']
无论上述情况如何,您都可以通过使用:

也许这可以用装饰师或者其他方法来完成

参数的顺序由调用者决定——装饰者无法改变这一点


顺便说一句,关于这个问题有一个草案

你能举个例子说明这些信息在哪里有用吗?据我所知,这是不可能的,因为命名参数在内部是作为字典处理的,对于简单的情况,没有orderWell,一种方法是从调用框架中读取函数调用行,并使用正则表达式或其他方法对其进行解析,但是如果函数调用跨越多行,这将无法正常工作。我更新了问题,python的版本不是important@Lucian为什么版本不重要?如果我给你一个Python3.5解决方案,它与你正在使用的Python版本不兼容,那该怎么办呢?谢谢你们的反对票。也许你可以添加一些评论,这样我就可以改进这篇文章了?正如我在我的文章中提到的,这对像
f(a=1,\nb=3)
@AshwiniChaudhary Fair这样的东西不起作用。有两件事:第一,我不会在任何类型的生产代码中使用这种技术,因为它在多行上拆分调用时会中断,就像Ashwini提到的那样。其次,解析函数是一个巨大的滥杀滥伤——您所需要的只是参数的顺序,不需要再次解析它。只需使用状态机或正则表达式过滤掉不分隔函数参数的逗号(在“,”[],(),{}中的逗号),然后通过确定
“{key}=”
中所有键的
kwargs
@l4mpi中的位置来计算实际参数的顺序是的,我同意这两点。对于第一个问题,我补充说它只在简单的情况下有效。关于第二点,我只是重新使用了一些旧代码,做的比这多一点。好吧,你在这里做了很多艰苦的工作,只需标记行: