[Python-ideas] str.format utility function

20 views
Skip to first unread message

Dag Moxnes

unread,
May 8, 2009, 6:05:15 PM5/8/09
to python...@python.org
Hi list,

I'm sorry if this has been discussed before, but I did not find any references. I've been playing abit with the new str.format function. I really like the syntax and simplicity.

However, when simply printing named variables in locals() or a class, I quite common use-case, I find it a bit too complicated with the **:

"Local variable var1 is %(var1)s" % locals()

vs

"Local variable var1 is {var1}".format(**locals())

and

"Instance variable var2 is %(var2)s" % self.__dict__

vs

"Instance variable var2 is {var2}" % **self.__dict__

Therefore I have made myself a utility funcion:

def easyformat(s, data):
    try:
        return s.format(**data)
    except TypeError:
        return s.format(**data.__dict__)

so that I can do the following:

"Local variable var1 is {var1}".format(**locals())

and

"Instance variable var2 is %(var2)s" % self

Should a function similar to this (maybe with a better name) be included included in some standard library?

-Dag


En om gangen eller alle på én gang? Få oppdateringer fra vennene dine på ett sted.

Gerald Britton

unread,
May 8, 2009, 7:27:15 PM5/8/09
to Dag Moxnes, python...@python.org
fwiw:

one = 'slower'
two = 'yours'
"my str is %(one)s than %(two)s" % locals()

is slower than:

"my str is %(one)s than %(two)s" % {"one":faster, "two":yours}

probably because of the overhead of the function call to locals().
Basically I find using locals() this way is just lazy programming,
since you hope your variables are in there somewhere. If someone
changes them later, your string expression may fail. I'd rather be
explicit about what I'm doing.

> _______________________________________________
> Python-ideas mailing list
> Python...@python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>
>

--
Gerald Britton
_______________________________________________
Python-ideas mailing list
Python...@python.org
http://mail.python.org/mailman/listinfo/python-ideas

Terry Reedy

unread,
May 8, 2009, 7:52:59 PM5/8/09
to python...@python.org
Dag Moxnes wrote:
> Hi list,
>
> I'm sorry if this has been discussed before, but I did not find any
> references. I've been playing abit with the new str.format function. I
> really like the syntax and simplicity.
>
> However, when simply printing named variables in locals() or a class, I
> quite common use-case, I find it a bit too complicated with the **:
>
> "Local variable var1 is %(var1)s" % locals()
>
> vs
>
> "Local variable var1 is {var1}".format(**locals())

I see nothing compicated about **. In any case, it is a common idiom
that Python progrmmers should learn and hopefully become comfortable
with. I see nothing gained with
s.easyformat(s, locals()) # over
s.format(**locals)
except a few extra chars to type ;-).

If you were doing that often, you could write

def lform(s): # format caller locals
l = <locals of caller> # ask on Python list or check python recipies
return s.format(**l)

> "Instance variable var2 is %(var2)s" % self.__dict__
>
> vs
>

> "Instance variable var2 is {var2}" % **self.__dict__\

You meant,
"Instance variable var2 is {var2}".format(**self.__dict__)

Wrapping this seems like a possible method. For a constant format
applicable to all instances, override .__str__().

> def easyformat(s, data):
> try:
> return s.format(**data)
> except TypeError:
> return s.format(**data.__dict__)

> Should a function similar to this (maybe with a better name) be
> included in some standard library?

I think not.

Terry Jan Reedy

Reply all
Reply to author
Forward
0 new messages