python argparse 设置未提供参数时的行为

2023-11-21

我对 python 相当陌生,并且在使用命令行参数时一直困扰着如何构建我的简单脚本。

该脚本的目的是自动执行我工作中与排序和操作图像相关的一些日常任务。

我可以指定参数并让它们调用相关函数,但我也想在未提供参数时设置默认操作。

这是我当前的结构。

parser = argparse.ArgumentParser()
parser.add_argument("-l", "--list", help="Create CSV of images", action="store_true")
parser.add_argument("-d", "--dimensions", help="Copy images with incorrect dimensions to new directory", action="store_true")
parser.add_argument("-i", "--interactive", help="Run script in interactive mode", action="store_true")
args = parser.parse_args()

if args.list:
    func1()
if args.interactive:
    func2()
if args.dimensions:
    func3()

但是当我不提供任何参数时,什么都不会被调用。

Namespace(dimensions=False, interactive=False, list=False)

如果没有提供参数,我想要的是一些默认行为

if args.list:
        func1()
    if args.interactive:
        func2()
    if args.dimensions:
        func3()
    if no args supplied:
        func1()
        func2()
        func3()

这看起来应该很容易实现,但我迷失了如何检测所有参数都是假的逻辑,而无需循环遍历参数并测试是否所有参数都为假。

Update

多个参数一起有效,这就是为什么我没有走 elif 路线。

Update 2

这是我更新的代码,考虑了 @unutbu 的答案

这似乎并不理想,因为所有内容都包含在 if 语句中,但短期内我找不到更好的解决方案。我很高兴接受@unutbu 的回答,如果提供任何其他改进,我们将不胜感激。

lists = analyseImages()
    if lists:
        statusTable(lists)

        createCsvPartial = partial(createCsv, lists['file_list'])
        controlInputParital = partial(controlInput, lists)
        resizeImagePartial = partial(resizeImage, lists['resized'])
        optimiseImagePartial = partial(optimiseImage, lists['size_issues'])
        dimensionIssuesPartial = partial(dimensionIssues, lists['dim_issues'])

        parser = argparse.ArgumentParser()
        parser.add_argument(
        "-l", "--list", 
        dest='funcs', action="append_const", const=createCsvPartial,
        help="Create CSV of images",)
        parser.add_argument(
        "-c", "--convert", 
        dest='funcs', action="append_const", const=resizeImagePartial,
        help="Convert images from 1500 x 2000px to 900 x 1200px ",)
        parser.add_argument(
        "-o", "--optimise", 
        dest='funcs', action="append_const", const=optimiseImagePartial,    
        help="Optimise filesize for 900 x 1200px images",)
        parser.add_argument(
        "-d", "--dimensions", 
        dest='funcs', action="append_const", const=dimensionIssuesPartial,
        help="Copy images with incorrect dimensions to new directory",)
        parser.add_argument(
        "-i", "--interactive", 
        dest='funcs', action="append_const", const=controlInputParital,
        help="Run script in interactive mode",)
        args = parser.parse_args()

        if not args.funcs:
            args.funcs = [createCsvPartial, resizeImagePartial, optimiseImagePartial, dimensionIssuesPartial]

        for func in args.funcs:
            func()

    else:
        print 'No jpegs found'

你可以append_const属性的函数,args.funcs,然后使用一个 if 语句在未设置选项的情况下提供默认行为:

if not args.funcs:
    args.funcs = [func1, func2, func3]

import argparse

def func1(): pass
def func2(): pass
def func3(): pass

parser = argparse.ArgumentParser()
parser.add_argument(
    "-l", "--list",
    dest='funcs', action="append_const", const=func1,
    help="Create CSV of images", )
parser.add_argument(
    "-i", "--interactive",
    dest='funcs', action="append_const", const=func2,
    help="Run script in interactive mode",)
parser.add_argument(
    "-d", "--dimensions",
    dest='funcs', action='append_const', const=func3,
    help="Copy images with incorrect dimensions to new directory")
args = parser.parse_args()
if not args.funcs:
    args.funcs = [func1, func2, func3]

for func in args.funcs:
    print(func.func_name)
    func()

% test.py
func1
func2
func3

% test.py -d
func3

% test.py -d -i
func3
func2

请注意,与原始代码不同,这允许用户控制函数的调用顺序:

% test.py -i -d
func2
func3

这可能是可取的,也可能是不可取的。


作为回应Update 2:

你的代码会工作得很好。但是,您可以通过以下另一种方式来组织它:

  • 而不是将主程序嵌套在if条款,你可以 使用

    if not lists:
        sys.exit('No jpegs found')
    # put main program here, unnested
    

    sys.exit将打印No jpegs found to stderr并以退出代码 1 终止。

  • 虽然我最初建议使用functools.partial,现在我想到了另一种——也许更简单——的方法:而不是

    for func in args.funcs:
        func()
    

    我们可以说

    for func, args in args.funcs:
        func(args)
    

    我们需要做的就是存储一个元组(func, args) in args.func而不是单独的功能。

例如:

import argparse
import sys

def parse_args(lists):
    funcs = {
        'createCsv': (createCsv, lists['file_list']),
        'resizeImage': (resizeImage, lists['resized']),
        'optimiseImage': (optimiseImage, lists['size_issues']),
        'dimensionIssues': (dimensionIssues, lists['dim_issues']),
        'controlInput': (controlInput, lists)
    }
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-l", "--list",
        dest='funcs', action="append_const", const=funcs['createCsv'],
        help="Create CSV of images",)
    parser.add_argument(
        "-c", "--convert",
        dest='funcs', action="append_const", const=funcs['resizeImage'],
        help="Convert images from 1500 x 2000px to 900 x 1200px ",)
    parser.add_argument(
        "-o", "--optimise",
        dest='funcs', action="append_const", const=funcs['optimiseImage'],
        help="Optimise filesize for 900 x 1200px images",)
    parser.add_argument(
        "-d", "--dimensions",
        dest='funcs', action="append_const", const=funcs['dimensionIssues'],
        help="Copy images with incorrect dimensions to new directory",)
    parser.add_argument(
        "-i", "--interactive",
        dest='funcs', action="append_const", const=funcs['controlInput'],
        help="Run script in interactive mode",)
    args = parser.parse_args()
    if not args.funcs:
        args.funcs = [funcs[task] for task in
                      ('createCsv', 'resizeImage', 'optimiseImage', 'dimensionIssues')]
    return args

if __name__ == '__main__':
    lists = analyseImages()

    if not lists:
        sys.exit('No jpegs found')

    args = parse_args(lists)   
    statusTable(lists)    
    for func, args in args.funcs:
        func(args)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python argparse 设置未提供参数时的行为 的相关文章

  • Python有条件求解时滞微分方程

    我在用dde23 of pydelay包来求解延迟微分方程 我的问题 如何有条件地编写方程 例如目标方程有两个选项 when x gt 1 dx dt 0 25 x t tau 1 0 pow x t tau 10 0 0 1 x othe
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • 使用 Django Rest 保存 Base64ImageField 类型会将其保存为原始图像。如何将其转换为普通图像

    我的模型中有 5 个图像字段 imageS imageS imageS imageS 和 imageE 我正在尝试按以下方式保存图像 图像的类型Base64ImageField images imageA imageB imageC ima
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 更改 python tkinter canvas 中的线坐标

    我画了一条线tkinter Canvas现在我想移动一端 这可能吗 例如和itemconfig import tkinter tk tkinter Tk canvas tkinter Canvas tk canvas pack line c
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • CKError 本地化描述

    Aim 我想显示CKError用户在应用程序中遇到的情况作为警报 所以我想从错误中提取可以显示给用户的字符串 Note 这个问题与要显示的 UI 代码无关 只是想从错误中提取有意义的字符串 我尝试使用 localizedDescriptio
  • 计算圆弧和直线之间的交点

    我想计算圆弧和直线之间的交点 我有直线和弧线的所有数据 对于线 起点和终点 对于圆弧 起点 终点 起点 终点角度 半径和中心点 我在这里附上一张图片 在下图中 我绘制了一条弧线和与该弧线相交的直线 所以现在我想找到交点 请给我一些算法或想法
  • 实用程序类..好还是坏?

    我一直在读到 通过在代码中使用静态类 单例来创建依赖项是一种不好的形式 并且会产生问题 紧密耦合和单元测试 我遇到的情况是 我有一组没有与之关联的状态的 url 解析方法 并且仅使用该方法的输入参数执行操作 我相信你对这种方法很熟悉 在过去
  • 在 JavaScript 或 TypeScript 中重命名时,阻止 VS Code 在解构赋值中添加“as”或别名

    当我在 JavaScript 或 TypeScript 中重命名变量时 VS Code 有时会在解构赋值中添加别名 const renamedProp prop arg After rename 或者它添加了as在进口中 import Fo
  • Git - 放弃仅大小写更改

    因此 我将 git 在 Windows 上使用 Git Extensions 2 与大型 VB6 代码库结合使用 对于不熟悉 VB6 的人来说 它不区分大小写 并且每次保存文件时都会更改变量名称的大小写 可以采取一些步骤来尽量减少这种行为
  • 重复的键值违反了唯一约束 - 尝试从 dask 数据帧创建 sql 表时出现 postgres 错误

    继从this问题 当我尝试从具有多个分区的 dask dataframe 创建 postgresql 表时 出现以下错误 IntegrityError psycopg2 IntegrityError duplicate key value
  • 使用全局变量在模块之间共享数据库

    我正在使用 mongodb 模块开发一个nodejs mongodb应用程序 该应用程序启动时使用 node main js 在 main js 中 我连接到数据库并将连接保留在 db 全局变量中 然后在 server 的内部方法中使用 d
  • 如何将切片转换为数组引用?

    我有一个 u8 并想把它变成一个 u8 3 无需复制 它应该引用原始数组 我怎样才能做到这一点 从 Rust 1 34 开始 您可以使用TryFrom TryInto use std convert TryFrom fn example s
  • 如何记录对 PHP 中函数的所有调用? (邮件()函数)

    我有一个带有数十个虚拟主机的专用服务器 我想确定哪个文件正在调用 mail 函数并全局记录它 我需要这样的东西 Wed Feb 13 10 42 39 2013 mail called from var www example1 php o
  • 了解 Ruby 中赋值和逻辑运算符的优先级

    我无法理解以下示例中 Ruby 运算符的优先级 x 1 y 2 Since 优先级高于 我的理解是类似于 and 运营商 1 2 3 4 其解析为 1 2 3 4 它应该等于 x 1 y 2 然而 所有 Ruby 源代码 包括内部语法解析器
  • 在 Dart 中什么时候使用 mixins 以及什么时候使用接口?

    我非常熟悉接口和抽象类的概念 但不太熟悉mixins 现在 在 Dart 中 每个类A定义一个隐式接口 可以由另一个类实现B通过使用implements关键词 没有明确的方法来声明接口 例如在 Java 中 接口仅包含未实现的方法 最终包含
  • 将 S3(法兰克福)与 Spark 结合使用

    有人在法兰克福使用 hadoop spark 1 6 0 来使用 s3 吗 我试图将作业的结果存储在 s3 上 我的依赖项声明如下 org apache spark spark core 1 6 0 exclude org apache h
  • @ngrx 中的效果中的连锁动作

    我在发出 HTTP 请求的 Effect 中一个接一个地链接操作时遇到一些问题 效果代码如下 export class UserEffects Effect update Observable
  • Spring中的form:label标签有什么优点?

  • 在 CI 环境中编写“heroku 登录”脚本

    是否有一种受认可的方法来编写脚本或绕过 Heroku Toolbelt 的登录提示 我遇到过许多声称提供解决方案的黑客 期望环境变量 在 netrc 中插入环境变量等 但我真的很想找到一个稳定的解决方案 根据我在文档中看到的内容 可以通过三
  • Castle Windsor - 我是否必须释放单例或非一次性瞬态对象?

    The 城堡维基在几个地方说我应该始终为通过容器解析的组件调用container Release 这对于复杂的生活方式管理技术 例如 LifeStyle Pooled 或使用专门的设施时显然是有意义的 但是我真的必须释放单例 在容器被处置之
  • jQuery 通过按类搜索来获取元素的 id

    这是我的html div class head div div div class some box a div div class some box b div div div 我想使用该 div 的类 head div 获取父 div
  • 为什么调用 FnOnce 闭包是一个举动?

    我试图将一个闭包传递给一个函数 然后该函数将在函数范围内改变传递给它的某些内容 根据我目前对 Rust 的理解 应该是这样的 pub fn call something callback FnOnce mut Vec
  • 调试器无法看到 Lambda 中的局部变量

    我注意到 当我将鼠标悬停在局部变量上时 当我的调试器停止在 lambda 内时 它会报告Cannot find local variable variable name 即使它在 lambda 内部可见并且已被使用 示例代码 public
  • python argparse 设置未提供参数时的行为

    我对 python 相当陌生 并且在使用命令行参数时一直困扰着如何构建我的简单脚本 该脚本的目的是自动执行我工作中与排序和操作图像相关的一些日常任务 我可以指定参数并让它们调用相关函数 但我也想在未提供参数时设置默认操作 这是我当前的结构