python
  • argparse
  • 2016-03-31 101 views 1 likes 
    1

    這裏是我的解析器配置的款Argparse NARGS =「+」吃位置參數

    parser.add_argument(
        'infile', help="The file to be imported", 
        type=argparse.FileType('r'), default=sys.stdin 
    ) 
    
    parser.add_argument(
        '--carpark', nargs='+', dest='CarparkID', type=int, default=[], 
        help="One or many carpark IDs" 
    ) 
    

    然而,--carpark說法似乎過於貪婪,吃任何它後面:

    $ mycommand --carpark 17 ~/path-to-file 
    mycommand: error: argument --carpark: invalid int value: '/home/oli/path-to-file' 
    

    什麼是這樣的好方法?我需要傳遞一個整數ID列表到命令中,但也有一個位置文件(也可以是stdin)。

    是否有 - 例如,一個非貪婪的nargs選項,只會解析這很有意義?

    +0

    請注意,爲位置參數指定默認值沒什麼意義,因爲它們不是可選的。 – chepner

    +0

    @chepner我的想法是允許我將事情管理到命令中,而不是做愚蠢的重定向。 – Oli

    回答

    3

    如果要指定多個汽車相提並論的ID,我會做的兩件事情,而不是使用nargs='+'之一:

    1. 使用一次,每個ID(mycommand --carpark 17 --carpark 18

      選項
      parser.add_argument('--carpark', 
              dest='carpark_ids', 
              type=int, 
              action='append', 
              default=[], 
              help="One carpark ID (can be used multiple times)" 
      ) 
      
    2. 取而代之以逗號分隔的單個參數(mycommand --carpark 17,18

      parser.add_argument('--carpark', 
              type=lambda s: map(int, s.split(",")), 
              dest='carpark_ids', 
              default=[], 
              help="One or more carpark IDs" 
      ) 
      

      有了更多的工作,您可以修改此選項以允許多次使用--carpark將其所有值累積到一個列表中。

    第三個替代方案,我不是特別喜歡的,就是放棄位置參數,而不是使用可選參數。 (mycommand --carpark 17 18 --infile ~/path-to-file)。

    parser.add_argument('--infile', 
            help="The file to be imported", 
            type=argparse.FileType('r'), 
            default=sys.stdin 
    ) 
    
    parser.add_argument('--carpark', 
            nargs='+', 
            dest='CarparkID', 
            type=int, default=[], 
            help="One or many carpark IDs" 
    ) 
    
    +0

    使用CSV可能是最有意義的,謝謝。 – Oli

    1

    這是行不通的?

    $ mycommand ~/path-to-file --carpark 17 
    

    有超過+操作消耗太多的爭論,沒有留下用於以下操作Python的錯誤/問題。

    參數分配基於參數計數,而不是type。分配後應用type函數,並且沒有規定返回「被拒絕」的參數。

    在正確的行爲中,它應該考慮到infile正在等待一個參數 - 並且沒有任何其他標誌字符串 - 因此爲該Action保留一個字符串。

    我可以看看這個bug /問題,但現在修復是以不同的順序提供參數。或者定義一個--infile動作(而不是位置)。

    一個較早的問題,與錯誤/問題鏈接(我的答案更注重獲取usage權利)。

    Argparse - do not catch positional arguments with `nargs`.

    +0

    它確實但它使參數位置。它必須是最後一個。在實踐中,實際上有更多的參數比我所說的還有另一個nargs =「+」參數給出了同樣的問題。不用說,不可能將兩個參數一起使用。 – Oli

    相關問題