V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
saodutbc
V2EX  ›  Python

如何优雅解决 click 模块 @option 的选项太多?

  •  
  •   saodutbc · 2017-03-11 19:16:58 +08:00 · 2304 次点击
    这是一个创建于 2616 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在为学校图书馆写一个基于命令行的监控脚本,准备用 click 来实现交互。但是现在遇到一个问题,就是 @option 的个数太多,就像下面这样:

    import click
    
    @click.command()
    @click.option('-a')
    @click.option('-b')
    @click.option('-c')
    @click.option('-d')
    ...
    @click.option('-z')
    def myscript(a, b, c, ..., z):
        if a:
            ...
    
        if b:
            ...
    
        ...
        
        if z:
            ...
    

    由于 @option 太多,必须要在myscript下面用大量的 if 语句一一检查用户是否给出了某个选项,这样的话代码结构太丑了,请问对这样的情况有什么好的解决方法?

    3 条回复    2017-03-13 12:43:43 +08:00
    bonfy
        1
    bonfy  
       2017-03-11 23:04:00 +08:00 via iPhone
    最近有个 python-fire 很火 可以看看

    至少不用写这么多 if
    PythonAnswer
        2
    PythonAnswer  
       2017-03-13 08:53:07 +08:00
    pocoo 喜欢滥用 @,实在是丑啊。
    siteshen
        3
    siteshen  
       2017-03-13 12:43:43 +08:00
    没用过 click ,不过 decorator 太多是可以抛弃语法糖,直接用循环解决:
    def myscript(self, ...):
    pass

    for option in reversed(['-a', '-b', ..., '-z']):
    myscript = click.option(option)(myscript)

    myscript = click.command()(myscript)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3131 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:31 · PVG 08:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.