Получить имена переменных из строки перед форматированием [duplicate]

2017 ответ: теперь вы можете делать то, что хотите, в каждом текущем браузере и узле

. Это довольно просто:

  • Вернуть обещание
  • Используйте 'await' , в котором JavaScript ожидает, что обещание будет разрешено в vlue (например, hTTP-ответ)
  • Добавьте 'async' для родительской функции

Вот рабочая версия вашего кода:

(async function(){

var response = await superagent.get('...')
console.log(response)

})()

ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]

9
задан Jace Browning 23 September 2014 в 17:23
поделиться

4 ответа

Вы можете использовать класс string.Formatter() для разбора полей в строке с помощью метода Formatter.parse() :

from string import Formatter

fieldnames = [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]

Демо:

>>> from string import Formatter
>>> yourstring = "path/to/{self.category}/{self.name}"
>>> [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
['self.category', 'self.name']
>>> yourstring = "non-keyword {keyword1} {{escaped brackets}} {} {keyword2}"
>>> [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
['keyword1', 'keyword2']

Вы можете проанализировать эти имена полей дальше; для этого вы можете использовать функцию str._formatter_field_name_split() (Python 2) / _string.formatter_field_name_split() (Python 3) (эта внутренняя деталь реализации не раскрывается иначе, Formatter.get_field() использует ее внутренне). Эта функция возвращает первую часть имени имени, ту, которая будет отображаться в аргументах, переданных в str.format(), плюс генератор для остальной части поля.

Генератор дает (is_attribute, name) кортежи; is_attribute истинно, если следующее имя должно рассматриваться как атрибут, false, если это элемент для поиска с помощью obj[name]:

try:
    # Python 3
    from _string import formatter_field_name_split
except ImportError:
    formatter_field_name_split = str._formatter_field_name_split
from string import Formatter

field_references = {formatter_field_name_split(fname)[0]
 for _, fname, _, _ in Formatter().parse(yourstring) if fname}

Демонстрация:

>>> from string import Formatter
>>> from _string import formatter_field_name_split
>>> yourstring = "path/to/{self.category}/{self.name}"
>>> {formatter_field_name_split(fname)[0]
...  for _, fname, _, _ in Formatter().parse(yourstring) if fname}
{'self'}

Учтите, что эта функция является частью внутренних деталей реализации класса Formatter() и может быть изменена или удалена с Python без уведомления и может быть даже недоступна в других реализациях Python.

31
ответ дан Martijn Pieters 23 August 2018 в 20:08
поделиться

Создав ответ Martijn, более простой формат для исчерпывающего списка, который я использовал:

>>> yourstring = "path/to/{self.category}/{self.name}"
>>> [x[1] for x in yourstring._formatter_parser() if x[1]]
['self.category', 'self.name']

Это функционально то же самое, гораздо проще переваривать.

1
ответ дан MacMcIrish 23 August 2018 в 20:08
поделиться

Вы можете сделать "path/to/{self.category}/{self.name}".format(self=self). Таким образом, вы можете работать с этими kwargs в __getattr__.

0
ответ дан pacholik 23 August 2018 в 20:08
поделиться

Если имена всех заполнителей названы, специальный словарь может использоваться для перехвата того, какие ключи пытались получить доступ и регистрироваться в массиве.

def format_keys(str_):
    class HelperDict(dict):
        def __init__(self):
            self._keys = []
        def __getitem__(self, key):
            self._keys.append(key)    
    d = HelperDict()
    str_.format_map(d)
    return d._keys

Обратите внимание, что если есть неназванные заполнители, IndexError будет увеличена на .format() (индекс кортежа за пределами диапазона).

3
ответ дан wim 23 August 2018 в 20:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: