我有以下腳本,其中我定義了一個logger和argparse實體化函式,然后我在main函式中呼叫它。
場景1:對于下面的代碼,如果一個非整數的值被傳遞給引數分析器,那么錯誤處理就會如期進行。
import argparse
import logging
def set_logger() -> logging.Logger:
dtfmt = '%d-%m-%y %H:%M:%S'/span>
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s :: [%(processName)s] :: %(levelname)s: %(message)s'。
datefmt=dtfmt。
handlers=[logging.StreamHandler()])
return logging.getLogger()
def argg() -> argparse.Namespace:
parser = argparse.ArgumentParser(prog='ProgramName'/span>,
description="一個運行時能做mircales的程式。大笑!"。
exit_on_error=False)
parser.add_argument('-integers', type=int)
return parser.parse_args()
def main()。
logger = set_logger()
try:
print(f'Integer value: {argg().integers}供應。')
except(AttributeError, argparse.ArgumentError)as e:
logger.error(e)
if __name__ == '__main__'/span>:
main()
當傳遞值'a'時,記錄器生成的錯誤資訊看起來如下(預期行為):
09-09-21 00:58:42 :: [MainProcess] :: ERROR: argument --integers: invalid int value: 'a'
場景2:但是,如果argg()函式被重新定義如下,即包括子決議器,當無效的值被傳遞給引數決議器時,錯誤處理就會失效。
def argg()。
parser = argparse.ArgumentParser(prog='ProgramName',
description="一個運行時能做mircales的程式。大笑!"。
exit_on_error=False)
subparsers = parser.add_subparsers(dest='mode')
subparser1 = subparsers.add_parser('regular', help="以regular模式運行程式")
subparser1. add_argument('-int', '-integers', type=int, required=True)
return parser.parse_args()
在這種情況下,傳入一個值'a',會導致默認的argparse錯誤,看起來像這樣:
我的問題是,為什么在方案2(即帶有子引數的argparse)中錯誤處理會失敗(記錄器沒有被呼叫)?
uj5u.com熱心網友回復: 沒有記錄器的東西,并且在一個 和子決議器的情況: 因此 我剛剛意識到, 一個子決議器是用與常規決議器相同的類來創建的,因此需要大多數相同的可選引數。 它并不繼承這些引數;它們必須被明確地包括在內。 我在其他情況下也看到過這種情況,比如
標籤: 上一篇:Python3,Apache,mod-wsgi'FileNotFoundError'未被定義
下一篇:Python例外準則解釋
Programname's name's parse_args()?
ProgramName regular: error: argument -int/--integers: invalid int value: 'a' ipython會話中。你的第一個案例在[11]。def argg0(argv) -> argparse.namespace:
...: parser = argparse.ArgumentParser(prog='ProgramName'/span>,
...: description="一個在運行時能做mircales的程式。大笑!"。
...: exit_on_error=False)
...: parser.add_argument('-integers', type=int)
...: return parser.parse_args(argv)
...:
在[12]: argg0(['-整數','xxx'])
回溯(最近一次呼叫)。
檔案 "/home/paul/mypy/argparse310.py", line 2476, in _get_value
結果 = type_func(arg_string)
ValueError: 無效的文字for int() with base 10。'xxx'。
在處理上述例外的程序中,發生了另一個例外。
回溯(最近一次呼叫)。
檔案"<ipython-input-12-f7f84a36f9f8>",行1,in<module>
argg0(['-integers','xxx'])
檔案"<ipython-input-11-0f7c85331b7b>",第6,in argg0
return parser.parse_args(argv)
檔案 "/home/paul/mypy/argparse310.py", line 1818, in parse_args
args, argv = self.parse_known_args(args, namespace)
檔案 "/home/paul/mypy/argparse310.py", line 1856, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
檔案 "/home/paul/mypy/argparse310.py", line 2060, in _parse_known_args
start_index = consume_optional(start_index)
檔案 "/home/paul/mypy/argparse310.py", line 2000, in consume_optional
take_action(action, args, option_string)
檔案 "/home/paul/mypy/argparse310.py", line 1912, in take_action
argument_values = self._get_values(action, argument_strings)
檔案 "/home/paul/mypy/argparse310.py", line 2443, in _get_values
value = self._get_value(action, arg_string)
檔案 "/home/paul/mypy/argparse310.py", line 2489, in _get_value
raise ArgumentError(action, msg % args)
ArgumentError:引數-整數:無效的int值。'xxx'。
在[13]。def argg1(argv)。
...: parser = argparse.ArgumentParser(prog='ProgramName'/span>,
...: description="一個在運行時能做mircales的程式。大笑!"。
...: exit_on_error=False)
...: subparsers = parser.add_subparsers(dest='mode' )
...: subparser1 = subparsers.add_parser('regular', help="以常規模式運行程式")
...: subparser1. add_argument('-int', '-integers', type=int, required=True)
...: return parser.parse_args(argv)
...:
在[15]中:argg1(['regular','-integers','xxx'] )
使用方法。ProgramName regular [-h] -int INTEGERS
ProgramName regular:錯誤:引數-int/--integers:無效的int值。'xxx'。
ipython錯誤回溯添加:發生了一個例外,使用%tb來查看完整的回溯。
回溯(最近一次呼叫)。
檔案 "/home/paul/mypy/argparse310.py", line 2476, in _get_value
結果 = type_func(arg_string)
ValueError: 無效的文字for int() with base 10。'xxx'。
...
ArgumentError: 引數 -int/--integers: 無效的int值。'xxx'。
exit_on_error=False在subparsers的情況下是不起作用的編輯
exit_on_error確實有效 - 但它必須是subparser定義的一部分:subparser1 = subparsers. add_parser('regular', help="以常規模式運行程式",exit_on_error=False)
help formatter class。
