簡體   English   中英

如何在Python 3中僅接受字符串類型的參數

[英]How to accept only string type arguments in Python 3

我正在嘗試為我的python文件創建一些參數參數。 我只想接受String類型作為參數。 以下是我的foo.py代碼-

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # options to the user 
    parser.add_argument('--source_table', type = str, required = True)

    args = parser.parse_args()
    params = vars(args) # convert arguments to dictionary
    print(type(params['source_table'])) # prints <class 'str'>

當我給字符串參數作為-

>python foo.py --source_table=abc

它打印

<class 'str'>

即使我輸入

>python foo.py --source_table=123

它打印

<class 'str'>

我想拋出一個錯誤,說只接受String類型。

"123"仍然是一個字符串,但是您似乎只想使用字母字符。 您可以在繼續執行之前檢查輸入:

import argparse
import re # regex 
if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # options to the user 
    parser.add_argument('--source_table', type = str, required = True)

    args = parser.parse_args()
    params = vars(args) # convert arguments to dictionary
    src_table = params['source_table']
    # check for alpha only
    if re.match(r'^[a-zA-Z]+$', src_table) is None:
        print("bad input, alpha characters only")
        return
    # continue normal execution
    print(type(src_table)) # prints <class 'str'>

或者您可以像下面這樣創建自己的argparse類型: Python argparse regex expression

編輯 @idlehands指出,下面的isalpha()僅足以用於字母。 如果要允許-_或其他特殊字符,則正則表達式仍然是可行的方法。 將上面代碼中的正則表達式更新為re.match(r'^[a-zA-Z\\-_]+$', src_table)以匹配-_

可以使用type函數來實現此要求:

def stringonly(astr):
    try:
        int(astr)
    except ValueError:
        return astr
    raise argparse.ArgumentTypeError('only a string type accepted')

這是~int類型。 僅當字符串可以解釋為整數時,它才會引發錯誤。 其他測試(例如isalpha也可以。 我本可以引發TypeErrorValueError ,但是ArgumentTypeError允許我自定義錯誤消息。

它將用作:

In [22]: parser = argparse.ArgumentParser()
In [23]: parser.add_argument('-s','--source', type=stringonly);


In [24]: parser.parse_args('-s 123'.split())
usage: ipython3 [-h] [-s SOURCE]
ipython3: error: argument -s/--source: only a string type accepted
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

In [25]: parser.parse_args('-s foo'.split())
Out[25]: Namespace(source='foo')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM