String formatters with variable argument length

John Machin sjmachin at lexicon.net
Thu Nov 30 20:33:47 EST 2006


Fredrik Tolf wrote:
> On Thu, 2006-11-30 at 16:26 -0800, John Machin wrote:
> > Fredrik Tolf wrote:
> [...]
> > > The thing is, I want to get format strings from the user, and I don't
> > > want to require the user to consume all the arguments. docs.python.org
> > > doesn't seem to have any clues on how to achieve this, and I can't think
> > > of what to google for.
> >
> > Three approaches spring to mind. In descending order of my preference:
> >
> > (a) don't do that
>
> It would be a possibility, since all current uses actually do have the
> right number of parameters. I would just like to keep the option
> available.
>
> > (b) parse the format string, counting the number of args required. If
> > the user has supplied more, throw them away.
>
> I was thinking of that, but it just seems far too ugly.

what's ugly about this:
[untested]:

def count_format_args(s):
    pending = False
    count = 0
    for c in s:
        if c == "%":
            # doubled % chars aren't counted
            pending = not pending
        elif pending:
            count += 1
            pending = False
    return count

output = format % arglist[:count_format_args(format)]


>
> > (c) wrap your execution of format_string % args in a try/except
> > bracket. If you get a TypeError with that message [not guaranteed to
> > remain constant in the future], throw away the last arg and go around
> > again.
>
> That might be a good possibility. Thanks for the idea! I do consider it
> quite a bit ugly, but that often happens when languages try to police
> programmers... :P
>
> > As a matter of curiosity, why don't you want the user to consume all
> > the arguments? Don't they get even a teensy-weensy warning message? Are
> > you writing a Perl interpreter in Python?
>
> Well basically, I'm rewriting a autodownloader for a file-sharing
> network in Python (previously written as a bash script, using the printf
> command), and I have a number of files scattered over my hard drive
> specifying search expressions, into which a potentially optional episode
> number can be inserted using sprintf-like arguments (using
> fsexpr="`printf "$sexpr" "$curep"`" in bash). I would like to keep it as
> a printf parameter, in order to be able to write e.g. %02i, and I would
> like to keep it optional, for downloading non-episoded stuff.
>
> I couldn't help noticing that the named variant of the % operator (using
> a dict, that is) doesn't require all its arguments to be consumed. Using
> that would require me to rewrite *all* the existing files, though.

So offer the named variant as an option for new users or new uses by
old users.

Cheers,
John




More information about the Python-list mailing list