【问题标题】:python argparse, how to refer args by their namepython argparse,如何通过名称引用 args
【发布时间】:2014-06-10 03:54:22
【问题描述】:

这是一个关于python中argparse的问题,可能很简单

import argparse

parser=argparse.ArgumentParser()

parser.add_argument('--lib')

args = parser.parse_known_args()

if args.lib == 'lib':
    print 'aa'

这会起作用,但是我不想调用 args.lib,我只想说“lib”(我不想输入更多),有没有办法将所有 args 变量导出模块(即更改范围)。这样我就可以直接检查 lib 的值,而不是在前面指定模块的名称

PS:我有很多变量,我不想重新分配每个变量

【问题讨论】:

  • 这种要求背后的原因是什么? args 在这里基本上是一个容器,一个命名空间。使用args.lib没有错。
  • 我不喜欢打字

标签: python argparse


【解决方案1】:

首先,我将推荐使用args 说明符。它非常清楚lib 的来源。也就是说,如果你发现你经常引用一个参数,你可以给它分配一个更短的名字:

lib = args.lib

有一种方法可以一次将所有属性转储到全局命名空间中,但它不适用于函数的本地命名空间,并且在没有充分理由的情况下使用 globals 是个坏主意。我不会考虑保存args. 的几个实例是一个足够好的理由。也就是说,这里是:

globals().update(args.__dict__)

【讨论】:

  • 只是好奇,在这种使用globals()locals() 的特定场景中真的有什么区别吗?这样做会更好/更糟吗?我知道这两个命名空间的区别,但在这种情况下会影响什么吗?
  • 我同意应该首选使用args 说明符。想象有一个 sys 导入模块,在解析 args 后使用,其中一个 args 称为 sys..shadowing。
  • @Bob:在模块级别,globals()locals() 做同样的事情。在函数内部,locals() 返回局部变量 dict,但修改该 dict 并不会真正改变局部变量。
  • 此外,如果参数被命名为from,那么你不能使用名为from的变量,因为它是一个Python关键字。 (所以globals().update(args.__dict__) 将默默地无法定义所需的变量。)
  • @unutbu:您也不能使用属性名称from,所以您可能会指定一个可以使用的dest
【解决方案2】:

当然,只需添加一行将args.lib 分配给lib

import argparse

parser=argparse.ArgumentParser()    
parser.add_argument('-lib')    
args = parser.parse_known_args()

lib = args.lib 

if lib == 'lib':
    print 'aa'

【讨论】:

  • 我有很多变量,我应该为所有变量都这样做吗?有更快的方法吗?
  • 如其他答案中所建议的那样,自动执行此操作的任何方式都可能会变得笨拙且不清楚。取决于有多少变量可能值得,但这取决于你
【解决方案3】:

粗略的......但只是因为你不能意味着你应该......而只是为了踢globals().update(dict(args._get_kwargs()))

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2010-10-09
    • 2023-03-19
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多