使用Tornado选项处理任意选项,例如** kwargs
发布时间:2020-12-20 11:31:01 所属栏目:Python 来源:网络整理
导读:我正在使用Tornado选项来定义命令行参数.但是,我希望能够将未在代码中定义的任意配置选项抛出到我的程序中.这些将有所不同,具体取决于程序应该做什么.例如,使用MAC地址连接到蓝牙设备或使用TTY连接到串行设备. 如果我在代码中定义了一组“强制”选项,然后在
我正在使用Tornado选项来定义命令行参数.但是,我希望能够将未在代码中定义的任意配置选项抛出到我的程序中.这些将有所不同,具体取决于程序应该做什么.例如,使用MAC地址连接到蓝牙设备或使用TTY连接到串行设备.
如果我在代码中定义了一组“强制”选项,然后在调用程序时添加一个额外的选项,我会得到parse_command_line()抛出的异常. 得到例如非常方便包含剩余(未定义)选项的字典.也就是说,就像** kwargs在函数中工作一样. 可以这样做吗? (解决方法是定义一个名为例如配置的字符串选项并将所有东西都放在那里,可能以某种巧妙的方式编码.当程序被另一个程序调用时,我可以例如对序列化的字典进行base64编码.) 更新:我注意到如果你添加命令行参数而没有前导破折号,Tornado将忽略它们并返回一个包含剩余(未定义)选项的列表. 解决方法
您可以创建OptionParser单例的子类并修改解析方法.例:
#!/usr/bin/python # -*- coding: utf-8 -*- import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import OptionParser import sys class MyOptionParser(OptionParser): def parse_command_line(self,args=None,final=True): if args is None: args = sys.argv remaining = [] for i in range(1,len(args)): # All things after the last option are command line arguments if not args[i].startswith("-"): remaining = args[i:] break if args[i] == "--": remaining = args[i + 1:] break arg = args[i].lstrip("-") name,equals,value = arg.partition("=") name = name.replace('-','_') if not name in self._options: # modified line self.print_help() # modified line raise Error('Unrecognized command line option: %r' % name) self.define(name,help="Arbitrary option") # new line option = self._options[name] if not equals: if option.type == bool: value = "true" else: raise Error('Option %r requires a value' % name) option.parse(value) if final: self.run_parse_callbacks() return remaining options = MyOptionParser() options.define("port",default=8000,help="run on the given port",type=int) class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(options.myoption) if __name__ == "__main__": options.parse_command_line() app = tornado.web.Application(handlers=[(r"/",IndexHandler)]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start() 与source的唯一区别是我正在定义传递选项而不是抛出异常.运行: python test.py --myoption="test" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |