gpt4 book ai didi

python - 使用 Tornado 选项处理任意选项,例如 **kwargs

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:22 25 4
gpt4 key购买 nike

我正在使用 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"

关于python - 使用 Tornado 选项处理任意选项,例如 **kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19657719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com