On 23Apr2021 18:25, Stephen J. Turnbull <[email protected]> 
wrote:
>Cameron Simpson writes:
> > I would _frequently_ like to be able to provide custom
> > conversions. At present I'm using elaborate hacks based on
> > __getattr__ etc to recognise things like this:
> >
> >     '{x} is {x_lc} in lowercase'
> >
> > where the _lc suffix is caught and a value computed from "x".
> >
> > Custom conversions would let me use this:
> >
> >     '{x} is {x!lc} in lowercase'
>
>I don't understand how this is supposed to work.  It looks to me like
>!code is a preprocessor: [...]
>If so,
>
>    '{x} is {x!lc:foo} in lowercase'
>
>will fail because str doesn't implement the 'foo' format code.

Maybe we're talking about different things. In the example above, I'm 
talking about "lc", not "foo".

>Do we
>really need to extend format() rather than using
>
>    def lc(x): return str(x).lower()
>
>    '{x} is {lc(x)} in lowercase'

I'm not talking about f'' strings, but str.format_map. They use the same 
{} placeholder syntax, but for obvious injection related reasons you 
can't call an arbitrary function from str.format_map. (You can play 
games with magic __getattr__ based attributes, like:

    {z.some_attr}

My use case is presupplied strings, eg a command line supplied format 
string. So _not_ an f'blah {lc(x)}' string, but a plain string using 
format_map. I'm enjoying using Python style string formats, and who 
wants to write yet another macro syntax?

Contrast:

    Python 3.9.2 (default, Feb 24 2021, 13:30:36)
    [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
    Type "help", "copyright", "credits" or "license" for more 
    information.
    >>> def lc(x): return x.lower()
    ...
    >>> z='ABC'
    >>> f'{lc(z)}'
    'abc'
    >>> fmt='{lc(z)}'
    >>> fmt.format_map({z:"ABC"})
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'lc(z)'

If I could provide additional formatters to format_map to extend beyond 
'r' for repr and friends, I could go:

    fmt.format_map({z:"ABC"}, conversion_map={'lc':lambda str.lower})

and use:

    fmt = '{z!lc}'

Cheers,
Cameron Simpson <[email protected]>
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/[email protected]/message/XJGWINSCNPC56ZQAGITQVV4AOY2NOKVC/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to