[Python-ideas] A read-only, dict-like optparse.Value
R. David Murray
rdmurray at bitdance.com
Fri Mar 20 17:55:04 CET 2009
Thomas Lee <tom at vector-seven.com> wrote:
> Hi folks,
>
> Would anybody support the idea of read-only dict-like behaviour of
> "options" for the following code:
>
> ====
>
> from optparse import OptionParser
> parser = OptionParser()
> parser.add_option("--host", dest="host" default="localhost")
> parser.add_option("--port", dest="port", default=1234)
> parser.add_option("--path", dest="path", default="/tmp")
> options, args = parser.parse_args()
>
> ====
I presume you know that dest is redundant there? I ask because you
wanted to avoid retyping the option names later :)
> As it is, you have to "know" what possible attributes are present on the
> options (effectively the set of "dest" attributes) -- I often implement
> something like the following because recently I've had to use command
> line options in a bunch of format strings:
>
> def make_options_dict(options):
> known_options = ("host", "port", "path")
> return dict(zip(known_options, [getattr(options, attr) for attr in
> known_options]))
>
> I don't mind having to do this, but having to hard code the options in
> there feels a bit nasty. Just as useful for my particular use case (i.e
> passing the options "dict" to a format string) would be something along
> the lines of options.todict() or dict(options). Even a way to know the
> set of "dest" attributes that are defined on "options" would be cleaner.
> e.g.
Well, given the implementation of optparse, you could do:
options.__dict__.items()
But exposing the full dictionary interface on options strikes me as a
reasonable idea. I don't see any particular reason to make it read-only,
either.
(NB: The Values class has some...interesting...methods that I wasn't
aware of that look somewhat intriguing. And they aren't read-only.)
> options_dict = dict(zip(options.all(), [getattr(options, attr) for attr
> in options.all()]))
>
> Where options.all() returns all the option "dest" attribute names.
>
> Or something to that effect.
>
> Any thoughts?
I don't see any reason not to just duck type the options object as
dictionary-like and use the normal dictionary method names to access
the information you want. Off the cuff it seems like a good idea
to expose an interface to this information.
Hmm. Then I could do globals().update(options.items()), which
would simplify some of my code :) (Whether or not that is a good
idea is a different question!)
--
R. David Murray http://www.bitdance.com
More information about the Python-ideas
mailing list