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中的位置来计算实际参数的顺序是的,我同意这两点。对于第一个问题,我补充说它只在简单的情况下有效。关于第二点,我只是重新使用了一些旧代码,做的比这多一点。好吧,你在这里做了很多艰苦的工作,只需标记行: