gpt4 book ai didi

没有提供参数时python argparse设置行为

转载 作者:太空狗 更新时间:2023-10-29 21:27:00 25 4
gpt4 key购买 nike

我是 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()

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

更新

多个参数一起有效,这就是我没有走 elif 路线的原因。

更新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

这可能是理想的,也可能不是。


响应更新 2:

您的代码可以正常工作。然而,这里有另一种组织方式:

  • 不是将主程序嵌套在 if 子句中,您可以使用

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

    sys.exitNo jpegs found 打印到 stderr 并以退出代码 1 终止。

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

    for func in args.funcs:
    func()

    我们可以说

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

    我们需要做的就是在 args.func 中存储一个元组 (func, args)而不是单独的函数。

例如:

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)

关于没有提供参数时python argparse设置行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14358753/

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