Должен ли я использовать f-строку при написании с eval()

Так недавно я узнал, что eval() - это удивительная функция, которая может превратить строку в команду кода, это может быть очень полезно при написании функции, где аргумент является строкой имени функции.

Но мне интересно, что является более питоническим способом его использования. Пример:

a = [1,2,3,1,2,3,4,1,2,5,6,7]
b = 'count'
target = 2
# regular way
print(a.count(target))  # >>> 3

Я попытался написать с помощью f-строки, которая бы работала:

print(eval(f'{a}' + '.' + b + f'({target})'))  # >>> 3

Что меня поразило, так это то, что он будет работать, даже если я не использую f-строку:

print(eval('a' + '.' + b + '(target)'))  # >>> 3

Это теперь немного для меня, потому что без f-строки 'a' может сбить с толку, будет нелегко определить, является ли это просто строкой или переменной, притворяющейся строкой.

Не знаете, как вы, ребята, думаете об этом? Какой из них более питонический для вас?

Спасибо!

0 ответов

Как уже упоминалось в комментариях, eval опасен (Александр Хусзаг) и редко необходим.

Однако, похоже, у вас проблемы с f-струнами.

До версии 3.6 было два способа построения строк:

'a' + '.' + b + '(target)'

а также

'{}.{}({})'.format(a, b, target)

С вашими значениями для a, b и target они оба оценивают: '[1,2,3,1,2,3,4,1,2,5,6,7].count(2)'

Когда у вас есть несколько переменных, первый вариант загроможден плюсами и кавычками, а второй имеет проблемы с читабельностью; какой набор{} соответствует какой переменной (или выражению).

Вариант второго способа - поставить имена в {} и обращайтесь к этим именам в формате:

'{a}.{b}({target})'.format(a=a, b=b, target=target)

Это делает .format версия более читабельна, но очень многословна.

С введением f-строк мы теперь включаем выражения внутри {}, аналогично названной версии .format, но без .format(...) часть:

f'{a}.{b}({target})'

Фа-струны - явное улучшение обоих + а также .format версия в удобочитаемости и ремонтопригодности.

То, как вы используете f-строки, хотя технически правильно, не является питоническим:

f'{a}' + '.' + b + f'({target})'

Кажется, вы в основном используете f'{a}' как альтернатива str(a).

Обобщить, f'{a}' + '.' + b + f'({target})' можно упростить как f'{a}.{b}({target})'

Другие вопросы по тегам