Что не так с этой реализацией интерполяции строк в Python * - PullRequest
1 голос
/ 17 августа 2011
import re

r = re.compile("#{([^}]*)}")

def I(string):
    def eval_str_match(m):
        return str(eval(m.group(1)))
    return r.sub(eval_str_match,string)

* помимо вкуса / стиля / стандартов Python

Есть ли более лаконичный способ назвать его, чем метод из одной буквы?
Может ли регулярное выражение пропустить?
я должен использовать repr вместо str?
Я знаю, что eval может быть опасным, но я не понимаю, почему

I("#{some_func()}\n")

хуже, чем

"%s\n" % str(some_func())

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Не совсем точно, что вы пытаетесь достичь, но работает ли это?

I = '{}\n'.format
I(some_func())

или

def I(func):
    return "%x\n" % func()
I(some_func())

Используя ваш пример из комментария,

I([x*2 for x in [1,2,3]])

отлично работает (хотя я не знаю, как вы хотите, чтобы вывод выглядел), как и

I(''.join((self.name, ' has ', self.number_of_children)))

, но вы действительно должны просто делать

'{} has {}'.format(self.name, self.number_of_children)

что еще одна строка.

1 голос
/ 12 мая 2013

Это то, что я придумал.

в my_print.py:

import sys

def mprint(string='', dictionary=None):
    if dictionary is None:            
        caller = sys._getframe(1)
        dictionary = caller.f_locals
    print string.format(**dictionary)

пример:

>>> from my_print import mprint
>>> name = 'Ismael'
>>> mprint('Hi! My name is {name}.')
Hi! My name is Ismael.
>>> new_dict = dict(country='Mars', name='Marvin',
...                 job='space monkey', likes='aliens')
>>> mprint("Hi! My name is {name} and I'm from {country}."
...     " Isn't {name} the best name?!\nDo you know any other {name}?", new_dict)
Hi! My name is Marvin and I'm from Mars. Isn't Marvin the best name?!
Do you know any other Marvin?

См:

Реализация интерполяции строки Python

...