У меня есть функция с именованными аргументамикак получить порядок именованных аргументов после вызова функция
def sample(a=None, b=None, c=None)
pass
как получить порядок этих аргументов после вызова функции?
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 фильтра способом, но через именованные аргументы
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
после вызова функции, мне нужно, чтобы получить правильный порядок запроса , вот так http://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-and-filter.html
Я просто не могу построить запрос, чтобы сохранить строгий порядок
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?
Можете привести пример, где эта информация была бы полезна? – Kevin
Насколько я знаю, это было бы невозможно, так как именованные аргументы обрабатываются как словари внутри, которые не имеют порядка – Finwood
Ну, для простых случаев одним способом было бы прочитать строку вызова функции из вызывающего кадра и проанализировать ее используя регулярное выражение или что-то еще, но это не будет работать должным образом, если вызов функции охватывает несколько строк. –