optparse -- anyway to find if the user entered an option?

James Stroud jstroud at mbi.ucla.edu
Sat Apr 14 19:57:56 EDT 2007


Karthik Gurusamy wrote:
> Hi,
> 
> I see that I can provide a default value for an option. But I couldn't
> find out any way if the user really entered the option or the option
> took that value because of default. A simple check for value with
> default may not always work as the user might have manually
> entered the same default value.
> 
> Let's assume I want to take in the ip-address using -i <ip-addr>.
> If user didn't give it explicitly, I am going to use socket interface
> to figure out this host's IP address.
> 
> ip_addr_default  = '100.100.100.100'
> 
> parser.add_option("-i", "--ip-address", dest="ip",
> default=ip_addr_default,
>            metavar="IP-ADDRESS", help="IP address. default:" +
>            ip_addr_default + "e.g. --i=1.1.1.1"
>            )
> 
> (options, args) = parser.parse_args()
> 
> Now if options.ip == ip_addr_default, I still can't be 100% sure that
> the user did not type -i 100.100.100.100.
> Any way to figure out from options that the user typed it or not?
> 
> (The reason I want to know this is if user did not mention -i, I can
> compute IP later
> using socket module)
> 
> I could think of a hack of using None as default and since no user can
> ever
> enter a None value, I can be sure that the user didn't provide -i.
> I'm wondering if there is a cleaner approach -- something like
> parser.opt_seen("-i")
> 
> Thanks,
> Karthik
> 

Using None wouldn't be a hack, it would rather be a common and 
straightforward python idiom.

Compare:

   if parser.opt_seen("-i"):
     do_whatever()

to

   if options.ip is None:
     do_whatever()

Looks like the second even saves a little typing. After using the former 
a while, I would venture to guess that you might realize how the latter 
is actually cleaner.

James



More information about the Python-list mailing list