Должен ли я использовать 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})'