为什么这个python异常不是ValueError?
守则:为什么这个python异常不是ValueError?,python,Python,守则: import datetime TF = "%d-%M-%Y %H:%M" last= datetime.datetime.strptime( "11/07/10 10:00", TF) 引发以下异常: Traceback (most recent call last): File "strange.py", line 4, in <module> last= datetime.datetime.strptime( "11/07/10 10:00", TF)
import datetime
TF = "%d-%M-%Y %H:%M"
last= datetime.datetime.strptime( "11/07/10 10:00", TF)
引发以下异常:
Traceback (most recent call last):
File "strange.py", line 4, in <module>
last= datetime.datetime.strptime( "11/07/10 10:00", TF)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 308, in _strptime
format_regex = _TimeRE_cache.compile(format)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 265, in compile
return re_compile(self.pattern(format), IGNORECASE)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 194, in compile
return _compile(pattern, flags)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 251, in _compile
raise error, v # invalid expression
sre_constants.error: redefinition of group name 'M' as group 5; was group 2
回溯(最近一次呼叫最后一次):
文件“奇怪的.py”,第4行,在
last=datetime.datetime.strtime(“11/07/10 10:00”,TF)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py”,第308行,在_strptime中
format\u regex=\u TimeRE\u cache.compile(格式)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strtime.py”,第265行,编译中
返回重新编译(self.pattern(format),IGNORECASE)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py”,编译中的第194行
返回编译(模式、标志)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py”,第251行,在编译中
raise错误,v#表达式无效
sre_constants.error:将组名“M”重新定义为组5;是第2组
现在我相信我的错误是在定义日期格式时使用了%M两次。我的问题是:
我希望代码能够:
a) 接受这样一个事实:在一个字符串中有两次相同的时间值(它可能是redundent,但如果有剩余的日期,“星期一”也是redundent)
b) 抛出一个值错误,指出同一字段不应使用多次
这看起来很不一样。发生什么事了
值错误
用于“内置操作或函数接收到类型正确但值不正确的参数”-因此在这种情况下,这意味着将TF
作为格式错误的字符串发送(例如,尝试使用%K
)
在这里,您使用了正确的格式,但正如错误所述,您在SRE-paring部分失败,因为您两次定义了相同的组(这就是
%x
s的解释方式),并且regex解析器失败,因为当您告诉他组M
应该匹配字符串的两个不同部分时,它无法理解,它无法自行“猜测”。没有任何东西可以直接检测到您所犯的特定错误
datetime模块将您的strtime
格式转换为正则表达式以进行实际解析,而无需对其进行足够详细的分析(或需要对其进行任何分析),以注意重复的字段。这导致了一个无效的正则表达式,并且RE模块正确地抛出了一个错误,我认为它比一个ValueError更接近于一个合成错误。datetime模块在没有试图找出问题根源的情况下传递了此消息。您有两个错误:
import datetime
TF = "%d-%m-%y %H:%M"
last= datetime.datetime.strptime( "11-07-10 10:00", TF)
祝你好运 这看起来像是一个错误,告诉您多次使用同一字段。它告诉你这个字段是
'M'
,它告诉你你想把它用作哪个组。因此,这是选项b。如果您查看跟踪,您可以看到这是将模式转换为regexp的副作用,然后会失败。由于strtime调用通过引发ValueError
来处理其他格式错误,因此您可以提出一个相当不错的参数,您看到的行为是一个bug。此调用针对错误格式抛出ValueError
,因此期望ValueError
是合理的。其中的代码看起来像是raisevalueerror("“%s”是一个错误的指令,格式为“%s”
等。对re.compile
的所有调用都在try块中,并重新抛出ValueError
。它们只是没有捕获它们。您可以合理地抱怨,这是一个错误。该调用与regexen无关,这是一个实现细节-没有理由它会泄漏到API和该API已返回无效格式的ValueError
。