【问题标题】:How to pass an int or string to a command line argument如何将 int 或 string 传递给命令行参数
【发布时间】:2014-02-11 12:43:19
【问题描述】:

我正在尝试找到一种将 int 或字符串传递给特定命令行参数的方法,但我知道传递到命令行的所有内容都作为字符串返回,有没有办法解决这个问题?

这是我的代码:

parser = ArgumentParser(
    description="Generate a simple presentation based on MTD file content"
    )
parser.add_argument(
    '-m',
    dest='mdd',
    help="Full path of target mdd",
    required=True,
    metavar="\"<data>.mdd\"",
    )
parser.add_argument(
    '-v',
    dest='version',
    help="The version (latest/active/basic or numerical version)",
    required=False,
    default='latest'
    )

args = parser.parse_args()

MDD_PATH = args.mdd
VERSION = args.version

这是我在命令行中输入的内容@

-m "C:\Users\xxxx\workspace\xxxx\src\Testing\Data\filename.mdd"
-v "22"

我希望 -v 同时接受整数和字符串,它有一个默认属性,如果需要可以绕过,但我需要一些帮助以允许它在整数和字符串之间切换。

谢谢

【问题讨论】:

    标签: python parsing command-line-arguments


    【解决方案1】:

    对于命令行,一切都是字符串。您的程序无法区分:

    program -v "22"
    

    program -v 22
    

    shell 使用引号来转义参数中的空格。


    在您的python代码中,您可以尝试将其转换为int:

    VERSION = args.version
    try:
        VERSION = int(VERSION)
    except ValueError:
        pass
    

    【讨论】:

    • @Boosted_d16:我回答的后半部分
    • 行得通……尽管我在字符串上使用了 isdigit() 方法。谢谢!
    • 为什么不使用关键字type 来进行转化?
    • @bvidal:不知道它需要自定义函数
    • @Eric 在这种情况下,您甚至不需要自定义函数,因为 int(22)int("22") 可以正常工作。
    【解决方案2】:

    您可以使用add_argument method 的关键字参数type。它定义了一种使用内置类型或回调将命令行参数转换为几乎任何您想要的任何东西的方法。 它提供了更好的错误处理,并且是对命令行进行“类型检查”的首选方式。

    【讨论】:

    • 同意,我现在使用 type 参数。谢谢!
    【解决方案3】:

    使用type 参数,您还可以过滤掉无效字符串:

    def parse_version(v):
        if v in ('latest', 'active', 'basic'):
            return v
        else:
            return int(v)   # this will error if v is non-numeric, causing the
                            # parser to reject the argument
    
    parser.add_argument(
        '-v',
        dest='version',
        help="The version (latest/active/basic or numerical version)",
        required=False,
        default='latest',
        type=parse_version
    )
    

    【讨论】:

      【解决方案4】:

      我喜欢使用我通常称为tryconvert 的通用辅助函数。给定一个值和一个类型列表(实际上是任何可调用的),它会尝试将值转换为每种类型并返回第一个有效的转换。如果全部失败,则返回原始值。

      def tryconvert(value, *types):
          for t in types:
              try:
                  return t(value)
              except ValueError, TypeError:
                  pass
          return value
      

      这可以与您的add_argument 调用中的type 参数一起使用,如下所示:

      parser.add_argument(
          '-v',
          dest='version',
          help="The version (latest/active/basic or numerical version)",
          required=False,
          default='latest',
          type=lambda v: tryconvert(v, int)
      ) 
      

      如果对数字的解析失败(例如None),您可以让它返回一些其他值,只需将始终返回None 作为最后一个参数的函数传递给tryconvert()。此“转换”将始终成功,因此如果没有其他转换有效,则将返回该值。如果您经常使用tryconvert,为了便于阅读,编写一个生成此类函数的辅助函数会很方便:

      def default(value):
          return lambda *a: value
      
      parser.add_argument(
          '-v',
          dest='version',
          help="The version (latest/active/basic or numerical version)",
          required=False,
          default='latest',
          type=lambda v: tryconvert(v, int, default(None))
      )
      

      【讨论】:

        猜你喜欢
        • 2013-10-11
        • 1970-01-01
        • 2012-09-01
        • 2020-08-02
        • 2014-01-13
        • 2020-09-02
        • 2014-05-03
        • 2011-10-14
        相关资源
        最近更新 更多