在swift中的命令设置并没有进行字符串的定义,而是使用了python的反射机制,也即,命令参数,是Manager类中的函数名称,先我们将用到的函数列举如下,
函数command函数,是管理服务,也是直接进行命令下发的类,Manager中的成员有的是命令执行函数,而有的则不是,那么就需要进行区分,这里我们使用的是@command进行区分的,使用@command声明的函数就是命令执行函数,同时其函数名称也是命令参数
def command(func):
"""
Decorator to declare which methods are accessible as commands, commands
always return 1 or 0, where 0 should indicate success.
:param func: function to make public
"""
func.publicly_accessible = True
@functools.wraps(func)
def wrapped(*a, **kw):
rv = func(*a, **kw)
return 1 if rv else 0
return wrapped
Manager相关函数如下
class Manager(object):
@command
def status(self, **kwargs):
"""display status of tracked pids for server
"""
status = 0
for server in self.servers:
status += server.status(**kwargs)
return status
@command
def start(self, **kwargs):
"""starts a server
"""
setup_env()
status = 0
for server in self.servers:
server.launch(**kwargs)
if not kwargs.get('daemon', True):
for server in self.servers:
try:
status += server.interact(**kwargs)
except KeyboardInterrupt:
print _('\nuser quit')
self.stop(**kwargs)
break
elif kwargs.get('wait', True):
for server in self.servers:
status += server.wait(**kwargs)
return status
...
def list_commands(cls):
#返回一系列可以作为命令的函数的字符串,三个双引号,表示三个双引号之间的内容都是一个
"""Get all publicly accessible commands
:returns: a list of string tuples (cmd, help), the method names who are
decorated as commands
"""
get_method = lambda cmd: getattr(cls, cmd)#lambda匿名函数,定义了一个变量get_method,参数是cmd,直接调用getattr
return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip())
#遍历Manager对象的成员,如果成员又属性'publicly_accessible',该属性是在@command 中进行定义的而后面的for...语句,则是sort自定义的
#过滤执行体,符合条件的才会加入。则返回该成员,如果没有,则返回False,对于符合条件的成员则获得一个键值对,一个是名称如"start"一个是描述
for x in dir(cls) if
getattr(get_method(x), 'publicly_accessible', False)])#
现整理代码如下:
import functools
def command(func):
func.publicly_accessible = True
@functools.wraps(func)
def wrapped(*a, **kw):
rv = func(*a, **kw)
return 1 if rv else 0
return wrapped
class Manager():
"dasda"
@command
def status(self, **kwargs):
'miaoshustatus'
print 'status'
def start(self, **kwargs):
'miaoshustart'
print 'start'
def no_wait(self, **kwargs):
'miaoshunowait'
print 'no_wait'
def no_daemon(self, **kwargs):
'miaoshuno_daemon'
print 'no_daemon'
@classmethod
def list_commands(cls):
print getattr(getattr(cls,'status'),"publicly_accessible",False)
get_method = lambda cmd: getattr(cls, cmd)#lambda匿名函数,定义了一个变量get_method,参数是cmd,直接调用getattr
return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip())
for x in dir(cls) if
getattr(get_method(x), 'publicly_accessible', False)])
print Manager.list_commands()
上述代码可以直接运行,这样我们就可以理解命令参数的问题了...