【发布时间】:2018-05-04 12:05:51
【问题描述】:
我有一个使用必需参数和一些可选参数的脚本。使用这些可选参数调用函数的最佳方式是什么?
现在我有这些if,但我很确定一定有更好的方法来处理这种情况。否则,如果不是 4 个可选参数,而是 100,我会怎么做(不好的做法,仅用于示例)?每个人都使用if?
def get_data(table, db='postgres', host='localhost', user='postgres', password=''):
....
....
....
kwargs = {}
if args.db:
kwargs['db'] = args.db
if args.host:
kwargs['host'] = args.host
if args.user:
kwargs['user'] = args.user
if args.password:
kwargs['password'] = args.password
data = get_data(args.table, **kwargs)
【问题讨论】:
-
所有
ifs 正在做的是将args转换为kwargs。这不能用**args...完成吗? -
@deceze args 是
argparseparse_args()的输出。如果我尝试直接使用它,它会显示argument after ** must be a mapping, not Namespace。 -
使用
get_data(**vars(args))。 -
@Aran-Fey 这是不对的,除非 OP 在参数解析器中指定与
get_data相同的默认值。 OP 不想覆盖函数默认值。 -
@AlexHall 我猜是的,但我将问题解释为“将
args对象转换为字典的更聪明的方法是什么”,而vars绝对足够了。之后过滤掉None值很容易。我添加了一个相关的骗子,这是一段懒惰的代码:get_data(**{k:v for k,v in vars(args).items() if v is not None})
标签: python python-3.x