如果不使用则忽略def?

时间:2014-05-12 14:58:07

标签: python

我有以下脚本 -

import os, errno
import argparse

def removecompressed(filename):
    try:
        os.remove(filename)
        print('Removing {}'.format(args.compressedfile))
    except OSError as e: # this would be "except OSError, e:" before Python 2.6
        print ('File {} does not exist in location {}!'.format(args.compressedfile, args.localpath))
        if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
            raise # re-raise exception if a different error occured

def removeencrypted(filename):
    try:
        os.remove(filename)
        print('Removing {}'.format(args.encryptedfile))
    except OSError as e: # this would be "except OSError, e:" before Python 2.6
        print ('File {} does not exist in location {}!'.format(args.encryptedfile, args.localpath))
        if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
            raise # re-raise exception if a different error occured

parser = argparse.ArgumentParser()
parser.add_argument('-p', '--localpath', type=str, default='', help="the path containing the files")
parser.add_argument('-c', '--compressedfile', type=str, default='', help="the compressed file to be deleted")
parser.add_argument('-e', '--encryptedfile', type=str, default='', help="the encrypted file to be deleted")
args = parser.parse_args()

removecompressed(args.localpath + args.compressedfile)
removeencrypted(args.localpath + args.encryptedfile)

但我希望-e和-c参数是可选的。我该怎么做呢?

我理解这个回复: Argparse optional positional arguments?

但问题是def首先解析2个字符串以生成文件名。如果我删除其中一个参数,它会抱怨添加字符串和无值。

编辑 - 如果我使用所有3个参数那就没有问题。如果我删除了-e或-c,例如,我删除了-e,我得到以下异常 -

Traceback (most recent call last):
  File "cleanup.py", line 35, in <module>
    removeencrypted(args.localpath + args.encryptedfile)
TypeError: Can't convert 'NoneType' object to str implicitly

我已将我的论点更新为包含default =&#39;&#39;

1 个答案:

答案 0 :(得分:2)

从您的问题中不清楚,如果未提供其中一个参数,应该会发生什么,但原则上,您可能希望提供默认 value:

parser.add_argument('-c', '--compressedfile', type=str, default='', help="the compressed file to be deleted")

如果在命令行中未提供特定命令标志,则使用此值。


请注意,您未使用可选的位置参数,您使用的是可选的常规参数(这是默认行为)。