网站LOGO
博客 | 棋の小站
页面加载中
2月21日
网站LOGO 博客 | 棋の小站
记录学习,心得,状态,生活。
菜单
  • 热评
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    docopt -- 一个优雅的 Python 库
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    按住ctrl可打开默认菜单

    docopt -- 一个优雅的 Python 库

    · 原创 ·
    学学编程 · Python
    共 3395 字 · 约 4 分钟 · 349

    文章
    摘要

    无摘要。

    最近浏览微信公众号,看到了这个Python库,很喜欢,在此分享给大家。

    在正式介绍这个Python库之前,先说一下我的网站搭建到什么进度了。我现在正在将网站数据从typecho数据库迁移至我的数据库,但是这俩数据库结构天差地别,在迁移时遇到了很多问题(现在大多数都解决了,就剩下评论的父级评论id查找),不过它终于要到结尾了。现在我除了要完成学校的项目,还要完成自己的网站建设,当然我还要打游戏,所以进度也是比较缓慢,不过我首先打算迁移的网站就是博客了。我的网站到现在备案也有一星期了,估计一星期以后就可以上线了。我也不想弄太多花哨的动画,也不想搞各种界面设计,所以我的网站主打的就是简洁。上篇文章计划实现的功能也在陆续添加,但是现在就是先实现最基本的功能。等我将寻找父级评论id这个事搞定了之后,新网站最先有的就是博客文章和评论。对,只有这俩,再加一个文章列表,连关于页面都没有。

    从现在开始,*.qi1.zone域名将不再维护,只会在里面更一些文章,里面组件、链接失效、404等问题将不再解决(其实我的Github等账号地址早就已经换了,页脚的链接已经失效了,但我也不打算更换)。待新站点上线以后,所有新文章都会在这两个站点同步上线,评论也会尽量同步(当然,数据库还是两个,因为这两个数据库结构完全不同,所以数据库迁移费了我好久时间)。

    从此文章开始,blog.qi1.zone域名将不再制作单独的封面,也不会有摘要等内容,它将仅仅作为归档。

    接下来正式介绍这个库吧。

    其实我有打算过将我的后端服务器打包成可执行文件,通过Linux的命令行启动时,可以通过加参数实现不同的功能。比如,通过 --help 选项来查看帮助信息,通过 -v 来获取版本信息,或者通过 --input=file.txt 来指定输入文件。但使用Python自带的subprocess模块或sys模块解析,结果总是那么不尽人意。

    什么是 docopt

    docopt不是那些典型的参数解析库,它基于一个简单的前提:如果你可以写出一个良好的帮助信息,那么你已经定义了程序的界面。简单地说,docopt允许你直接将帮助文档字符串作为定义参数的界面。它帮助你定义一个接口规范,并且能够自动解析与这个规范相符的命令行参数。

    开发者 Vladimir Keleshev 在2012 年推出了 docopt,并开源在 GitHub 上。随后,有越来越多的开发者参与到这个项目中,使其成为最受欢迎的 Python 命令行解析工具之一。docopt 简化了命令行处理流程,将我们从繁琐的参数解析代码中解放出来。

    与它类似的库有 argparse 和click,但 docopt 的独特之处在于它的声明式界面设计。你直接写出命令行应该如何被调用的文档,然后 docopt 为你解析出所有的选项和参数。这种接口设计方法是直观且易于记忆的,减少了学习成本,让开发者可以更专注于其他更重要的工作。

    安装

    安装 docopt 十分简单,只需要一行 pip 命令:

    bash 代码:
    pip install docopt

    命令行参数格式化

    要理解 docopt 的运用方法,我们首先要理解命令行参数的结构。

    docopt 的一个重要概念是形式语法(格式),它允许使用下述的几种模式:

    • 尖括号 <like_this> 用于参数,这些是必须由用户提供的值。
    • 方括号 [like_this] 用于可选的元素。
    • 大括号 {like_this} 基本上不使用,但你可以用它们来构成自己的语法标记。
    • 圆括号 (like_this) 用于表示一组选项中必须选择一个。
    • 管道符 | 用于分割可供选择的各个选项。
    • 双破折号 --like_this 通常用于长选项式样的命令行选项。
    • 单破折号 -l 通常用于单字母的命令行选项。
    • 点点点 ... 表示可以重复的元素。

    通过以上这些格式标记,你可以创建几乎任何你需要的命令行界面。

    下面我们看看,如何定义和解析参数。

    解析命令行参数

    首先,定义一个简单的帮助文档作为字符串,这也将是我们程序的命令行接口规范。

    例子如下:

    python 代码:
    """Naval Fate.
    
    Usage:
      naval_fate.py ship new <name>...
      naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
      naval_fate.py ship shoot <x> <y>
      naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting]
      naval_fate.py (-h | --help)
      naval_fate.py --version
    
    Options:
      -h --help     Show this screen.
      --version     Show version.
      --speed=<kn>  Speed in knots [default: 10].
      --moored      Moored (anchored) mine.
      --drifting    Drifting mine.
    """
    
    from docopt import docopt
    
    if __name__ == '__main__':
        arguments = docopt(__doc__, version='Naval Fate 2.0')
        print(arguments)

    当你运行这个脚本时,你可以像下面这样输入命令行参数:

    python naval_fate.py ship new "Black Pearl" "Flying Dutchman"

    你会看到程序输出了解析后的参数,例如:

    {"ship": true,
    "new": true,
    "": ["Black Pearl",
    "Flying Dutchman"],
    "move": false, ...}
    每个命令行选项和参数都会得到一个字典条目。值为 true 或false 代表布尔型选项,其他如 和--speed 则包含传递的值或默认值。

    子命令

    docopt 非常适用于设计具有子命令的 CLI 程序,比如 git 那样有许多子命令的程序。

    示例:

    python 代码:
    """Git.
    
    Usage:
      git.py add <file>...
      git.py commit <message>
      git.py push <remote> <branch>
    """
    
    arguments = docopt(__doc__)
    如果某个用户尝试执行以下命令:
    
    python git.py commit "Initial commit"

    解析后的参数将是:

    {"add": false,
    "commit": true,
    "": "Initial commit",
    "push": false, ...}

    在你的程序中,你可以根据这些参数执行相应的逻辑,如提交代码、添加文件等。

    其他功能

    docopt 甚至支持更高级的模式匹配,比如选择(one-of)、可选项 (optional)、重复项和可能的细分(arguments, commands, options, ...)。比如,(set|remove) 意味着这是一个选择模式,必须匹配 set 或remove。

    详细信息请参考项目说明:https://github.com/docopt/docopt,限于篇幅,这里就不展开了。

    声明:本文由 (博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    现在已有

    6

    条评论
    发一条!
    1. 头像
      云晓晨CatchYun
      • 等级:Lv.5
      • 角色:首页 · 好友
      • 在线:本月

      快能看到新站点了,哈哈

      · · · 山东-东营
      1. 头像

        前端页面还一点没写呢,而且我也没啥美感,别有太大希望

        · · · 辽宁-沈阳
    2. 头像
      王光卫博客
      • 等级:Lv.1
      • 角色:访客
      • 在线:三月内

      放在Github还是很方便的

      · · · 四川-成都
      1. 头像

        这个在没有IDE的情况下运行Python代码很好,我的后台搭建很需要这个

        · · · 辽宁-沈阳
    3. 头像
      obaby
      • 等级:Lv.4
      • 角色:综合 · 好友
      • 在线:本月

      这个东西有点意思~~

      · · · 山东-青岛
      1. 头像
        obaby

        这个库还是很厉害的

        · · · 辽宁-沈阳
    博客logo 博客 | 棋の小站 记录学习,心得,状态,生活。
    ICP 冀ICP备2023007665号

    🕛

    本站已运行 299 天 10 小时 22 分

    🌳

    建站:Typecho 主题:MyLife

    👁️

    今日访问量:1568 昨日访问量:1607
    棋の小站 © 2024.
    网站logo

    博客 | 棋の小站 记录学习,心得,状态,生活。
     
     
     
     
    壁纸