为什么这个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模块在没有试图找出问题根源的情况下传递了此消息。

您有两个错误:

  • 格式不匹配,因为您在TF中使用“-”,并将“/”作为时间传递!您应该传递与字符串相同的格式

  • 您通过了2分钟符号('M'=分钟,'M'=月)

  • 这是适合您的正确解决方案:

    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