@TOC
烧瓶中经理源码如下所示:
<代码>类经理(对象): ”“” 控制器类来处理的一组命令。 典型的用法:: 类打印(命令): def运行(自我): 打印“你好” 应用=瓶(__name__) 经理=经理(应用) 经理。add_command(“打印”,print ()) if __name__==癬_main__”: manager.run () , dest=参数, 要求=False, 默认=默认)) 其他: 选项。追加(选项(arg”——% s ' % [0], 的——% s %参数, dest=参数, 类型=text_type, 要求=False, 默认=默认)) 其他: 选项。追加(选项(参数、类型=text_type)) self.run=函数 自我。__doc__=func.__doc__ 自我。option_list=选项 @ property def描述(自我):=自我描述。__doc__或“ 返回description.strip () def add_option(自我,选择): ”“” 添加选项,选项列表。 ”“” self.option_list.append(选项) def get_options(自我): ”“” 默认情况下,返回self.option_list。覆盖如果你 需要做特定的配置。 ”“” 返回self.option_list def create_parser(自我,* args, * * kwargs): func_stack=kwargs.pop (func_stack, ()) 父=kwargs.pop(“父”,没有一个) 解析器=argparse。ArgumentParser (* args, add_help=False, * * kwargs) help_args=self.help_args 虽然help_args没有和家长不是没有: help_args=parent.help_args 父=getattr(父母,“父”,没有一个) 如果help_args: 从flask_script进口add_help add_help(解析器,help_args) 在self.get_options选项(): 如果isinstance(选项,组): 如果option.exclusive: 组=parser.add_mutually_exclusive_group ( 要求=option.required, ) 其他: 组=parser.add_argument_group ( 标题=option.title, 描述=option.description, ) 选择在option.get_options (): group.add_argument(*选择。args, * * opt.kwargs) 其他: parser.add_argument(*选项。args, * * option.kwargs) parser.set_defaults (func_stack=func_stack +(自我)) 自我。解析器解析器=自我。父母=父 返回解析器 def __call__(自我,应用=None, * args, * * kwargs): ”“” 处理与给定应用程序的命令。 违约行为是叫‘self.run ' '在一个测试请求上下文中。 ”“” 与app.test_request_context (): 返回self.run (* args, * * kwargs) def运行(自我): ”“” 运行一个命令。这必须由子类实现。应该采取 参数配置的命令选项。 ”“” 提高NotImplementedError 代码>
下面分析下执行过程:
1,其他函数是对的选项(列表)的内容进行增删查操作
2, create_parser函数创建了命令行解析对象=argparse <代码>解析器。ArgumentParser (* args, add_help=False, * * kwargs)> 代码,获取选项中获取并保存选项中数据和help_args中数据,以及<代码> parser.set_defaults (func_stack=func_stack +(自我))> 代码将命令自己添加到解析器中参数中。
3,在瓶应用代码中我们添加例如<代码>经理。add_command(“数据库”,打印())> 代码的代码,传入了命令的实例对象,而add_command创建了命令的实例对象并保存在slef._commands的名称空间中或者key_value值中。
备注在祝辞祝辞在瓶应用代码中我们添加例如<代码>经理。MigrateCommand add_command (db) 代码>的代码,传入了经理的实例对象MigrateCommand——————另外一个经理对象(此对象,已经添加了添加了迁移等命令,后面会和当前这个瓶应用中经理对象建立关联self.parent)
, <强>调用>强方法中显示,当命令的实例对象被调用的时候,就会被执行(此时,引入应用实例的上下文,并执行了运行方法)。那么此时,我们就只要去寻找<代码>命令实例是何时被调用的代码>。
此时管理对象包装应用,并执行了自己的运行方法。如下所示。
运行方法中通过sys.argv接收了命令行参数,并把参数提交给<代码>通过。处理> 代码执行。
而处理方法中创建<代码> app_parser=self.create_parser(掠夺)代码>(此函数获取到Commad对象),获取了所有的app_parser的信息(函数和参数和配置)。
解析器什么时候被执行吗?
此时而app_parser依然是argparse中<代码> ArgumentParser> 代码对象。