[Python-ideas] Briefer string format

Ryan Gonzalez rymg19 at gmail.com
Mon Jul 20 16:08:54 CEST 2015


I would prefer something more like:

def f(s):
    caller = inspect.stack()[1][0]
    return s.format(dict(caller.f_globals, **caller.f_locals))


On July 20, 2015 8:56:54 AM CDT, "Eric V. Smith" <eric at trueblade.com> wrote:
>On 07/19/2015 07:35 PM, Mike Miller wrote:
>> Hi,
>> 
>> Ok, I kept the message brief because I thought this subject had
>> previously been discussed often.  I've expanded it to explain better
>for
>> those that are interested.
>> 
>> ---
>> 
>> Needed to whip-up some css strings, took a look at the formatting I
>had
>> done
>> and thought it was pretty ugly.  I started with the printf style, and
>had
>> pulled out the whitespace as vars in order to have a minification
>option:
>> 
>>     csstext += '%s%s%s{%s' % (nl, key, space, nl)
>> 
>> Decent but not great, a bit hard on the eyes.  So I decided to try
>> .format():
>> 
>>     csstext += '{nl}{key}{space}{{{nl}'.format(**locals())
>> 
>> This looks a bit better if you ignore the right half, but it is
>longer
>> and not
>> as simple as one might hope.  It is much longer still if you type out
>the
>> variables needed as kewword params!  The '{}' option is not much
>> improvement
>> either.
>> 
>>    csstext += '{nl}{key}{space}{{{nl}'.format(nl=nl, key=key, ...  #
>uggh
>>    csstext += '{}{}{}{{{}'.format(nl, key, space, nl)
>
>Disclaimer: not well tested code.
>
>This code basically does what you want. It eval's the variables in the
>caller's frame. Of course you have to be able to stomach the use of
>sys._getframe() and eval():
>
>#######################################
>import sys
>import string
>
>class Formatter(string.Formatter):
>    def __init__(self, globals, locals):
>	self.globals = globals
>        self.locals = locals
>
>    def get_value(self, key, args, kwargs):
>        return eval(key, self.globals, self.locals)
>
>
># default to looking at the parent's frame
>def f(str, level=1):
>    frame = sys._getframe(level)
>    formatter = Formatter(frame.f_globals, frame.f_locals)
>    return formatter.format(str)
>#######################################
>
>Usage:
>foo = 42
>print(f('{foo}'))
>
>def get_closure(foo):
>    def _():
>        foo # hack: else we see the global 'foo' when calling f()
>        return f('{foo}:{sys}')
>    return _
>
>print(get_closure('c')())
>
>def test(value):
>    print(f('value:{value:^20}, open:{open}'))
>
>value = 7
>open = 3
>test(4+3j)
>del(open)
>test(4+5j)
>
>Produces:
>42
>c:<module 'sys' (built-in)>
>value:       (4+3j)       , open:3
>value:       (4+5j)       , open:<built-in function open>
>
>Eric.
>
>
>_______________________________________________
>Python-ideas mailing list
>Python-ideas at python.org
>https://mail.python.org/mailman/listinfo/python-ideas
>Code of Conduct: http://python.org/psf/codeofconduct/

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150720/38eed6c4/attachment-0001.html>


More information about the Python-ideas mailing list