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 -- http://mail.python.org/mailman/listinfo/python-list