一、gopts.opt
在create.py文件中,gopts这个全局实例的操作太多了,这里之选择其中的一个分析
-
gopts.opt('defconfig', short='f', val='FILE',
-
fn=set_value, default='xmdefconfig',
-
use="Use the given Python configuration script."
-
"The configuration script is loaded after arguments have been "
-
"processed. Each command-line option sets a configuration "
-
"variable named after its long option name, and these "
-
"variables are placed in the environment of the script before "
-
"it is loaded. Variables for options that may be repeated have "
-
"list values. Other variables can be set using VAR=VAL on the "
-
"command line. "
-
"After the script is loaded, option values that were not set "
-
"on the command line are replaced by the values set in the script.")
-
-
gopts.default('defconfig')
直接看opts类的opt方法,
-
def opt(self, name, **args):
-
"""Add an option.
-
-
name option name
-
**args keyword params for option constructor
-
"""
-
x = Opt(self, name, **args)
-
self.options.append(x)
-
self.options_map[name] = x
-
return x
这个方法没有什么难理解的地方,穿件一个Opt类的实例,把它加到gopt的options链表中,和options_map字典中。在看Opt的构造函数之前,顺带开一下这里的**args的用法。
python中的这两个常用在作为函数的参数。我们都知道在python中的函数的参数传入方法有两种,一中是在调用时直接传入实参,不写形参的名字,此时,python将按照实参的顺序自动给相应的形参赋值,这是不支持跳跃赋值的。还有另外一种调用方法,在调用函数,传参数时把形参的名字也带上,比如foo(key=value)的形式(key是形参名,value是实参值),这种调用形式将不考虑形参和实参的顺序,而是按照调用时制定关系给形参赋值。
这样就对应了*args和**kwargs这两种用法。详细的不罗嗦了,看一下下面的例子都理解了。
-
#!/usr/bin/python
-
-
def foo(* args ,**kwargs):
-
print "args,", args
-
print "kwargs,",kwargs
-
print '****************'
-
-
def foo2(a = 1,b =2,c=3):
-
print 'a=:',a
-
print 'b=:',b
-
print 'c=:',c
-
print "****************"
-
if __name__ == "__main__":
-
foo(1,2,3)
-
foo(a = 1,b = 2,c = 3)
-
foo(1,2,3,a = 1,b = 2,c = 3)
-
foo(1,'b','c' ,a=1,b='b',c='c')
-
args=(4,5,6)
-
foo2(*args)
-
kwargs={'a':4,'b':5,'c':6}
-
foo2(**kwargs)
-
执行结果:
-
args, (1, 2, 3)
kwargs, {}
****************
args, ()
kwargs, {'a': 1, 'c': 3, 'b': 2}
****************
args, (1, 2, 3)
kwargs, {'a': 1, 'c': 3, 'b': 2}
****************
args, (1, 'b', 'c')
kwargs, {'a': 1, 'c': 'c', 'b': 'b'}
****************
a=: 4
b=: 5
c=: 6
****************
a=: 4
b=: 5
c=: 6
****************
接着看Opt类的构造方法吧。
-
def __init__(self, opts, name, short=None, long=None,
-
val=None, fn=None, use=None, default=None):
-
"""Create an option.
-
-
opts parent options object
-
name name of the field it controls
-
short short (1-char) command line switch (optional)
-
long long command-line switch. Defaults to option name.
-
val string used to print option args in help.
-
If val is not specified the option has no arg.
-
fn function to call when the option is specified.
-
use usage (help) string
-
default default value if not specified on command-line
-
"""
-
self.opts = opts
-
self.name = name
-
self.short = short
-
if long is None:
-
long = name
-
self.long = long
-
self.val = val
-
self.use = use
-
self.default = default
-
self.optkeys = []
-
if self.short:
-
self.optkeys.append('-' + self.short)
-
if self.long:
-
self.optkeys.append('--' + self.long)
-
self.fn = fn
-
self.specified_opt = None
-
self.specified_val = None
-
self.value = None
-
self.set(default)
这个构造方法,只需要关注两条语句。其一:第15行的self.opts=opts,从参数和传于的参数可见,这里的self的opts指向的Opts类的实例,这里当然就gopt这个全局实例了。其二:第33行self.set(default)。我们需要技术的deault这里传入的值是"xmdeconfig"
-
def set(self, value):
-
"""Set the option value.
-
"""
-
self.opts.setopt(self.name, value)
set函数调用opts的setopt方法,opts就是gopts了。name和value就是deconfig和xmdeconfig了。现在继跟踪到Opts类的setopt方法
-
def setopt(self, name, val):
-
"""Set an option value.
-
An option can also be set using 'opts.vals.name = val'.
-
"""
-
setattr(self.vals, name, val)
这个函数的功能就是向gopts这个实例的vals添加属性。在Opts类的__init__方法中有一句self.vals=OptVals(),所以gopt这个实例有一个OptVals类型的成员。但是OptVals这个类基本没有任何属性,它的实例的属性就是通过setopt方法来添加的。在setopt这个函数中掉用了setattr这个python内置的函数。这个函数与getattr一起,是很有用的两个函数。
先说setattr这个函数,原型:setattr(object,name,value)。其中object为实例,name为我们要为这个object添加的属性的名字,value就是我们要为这个object添加的name的值。、
对于getattr这个函数,原型:getattr(object,name,default_value),及获得object的名为name的属性的值,如果没有名为name的值,就放回default_value.
所以对于setopt,就是为了给Opts的实例的vals添加一个属性。对于gopts,执行完成之后就为器vals添加了一个deconfig=xmconfig这样的一个属性。
现在继续回到Opts的opt函数,现在到这两条语句了
self
.options
.append
(x
)
self
.options_map
[name
] = x
这两句把刚创建的x添加到options和options_map中。
至此Opts的opt方法就完成了,现在看create.py文件中的gopt.default('deconfig')吧。这个函数很简单,但是为了后面分析方便,这里还是要贴一下源码
-
def default(self, name):
-
self.default_opt = name
这个后面用到了在说吧。
阅读(1302) | 评论(0) | 转发(0) |