
On 24/06/2013 16:40, Barry Warsaw wrote:
On Jun 22, 2013, at 12:27 PM, Anders Hovmöller wrote:
Keyword arguments are great for increasing readability and making code more robust but in my opinion they are underused compared to the gains they can provide. You often end up with code like:
foo(bar=bar, baz=baz, foobaz=foobaz)
The DRY motivation for this proposal reminds me of PEP 292 ($-strings) and flufl.i18n. In some of the earlier i18n work I did, the repetition was overwhelmingly inconvenient. Generally, it doesn't bother me, but I really hated doing things like:
real_name = get_real_name() email_address = get_email_address() message = _('Hi $real_name <$email_address>').safe_substitute( real_name=real_name, email_address=email_address)
not to mention the high probability of typos, and the added noise making the source harder to read. flufl.i18n then, shortens this to:
real_name = get_real_name() email_address = get_email_address() message = _('Hi $real_name <$email_address>')
The locals and globals are collected into the substitution dictionary, to be applied after the source string is translated.
Yes, the implementation uses the dreaded sys._getframe(), but it's worth it.
Do you have to use sys._getframe()? Although it's a little longer: def _(message, variables): return re.sub(r"\$(\w+)", lambda m: variables[m.group(1)], message) You can then do this:
real_name = "REAL NAME" email_address = "EMAIL ADDRESS" _(m, globals()) 'Hi REAL NAME <EMAIL ADDRESS>' _(m, locals()) 'Hi REAL NAME <EMAIL ADDRESS>' def test(): real_name = "LOCAL REAL NAME" email_address = "LOCAL EMAIL ADDRESS" print(_(m, locals()))