Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的对象总是变成非类型?_Python_Object_Reset_Nonetype - Fatal编程技术网

Python 为什么我的对象总是变成非类型?

Python 为什么我的对象总是变成非类型?,python,object,reset,nonetype,Python,Object,Reset,Nonetype,我正在构建一个Youtube音频采样程序,并设置了一个名为time_snip的对象。 以毫秒为单位包含样本开始和结束的对象。 我注意到,如果我输入的时间正确,我会得到预期的输出,但是如果我以错误的格式键入时间(尝试/例外设置除外),并且我以正确的方式再次输入时间,我会得到一个AttributeError:“NoneType”对象没有属性“start” 时间剪类: 上课时间\u snip: 定义初始时间(自身、开始时间、开始时间、开始时间、开始时间秒、开始时间秒、结束时间、结束时间分钟、结束时间秒

我正在构建一个Youtube音频采样程序,并设置了一个名为time_snip的对象。 以毫秒为单位包含样本开始和结束的对象。 我注意到,如果我输入的时间正确,我会得到预期的输出,但是如果我以错误的格式键入时间(尝试/例外设置除外),并且我以正确的方式再次输入时间,我会得到一个
AttributeError:“NoneType”对象没有属性“start”

时间剪类:

上课时间\u snip:
定义初始时间(自身、开始时间、开始时间、开始时间、开始时间秒、开始时间秒、结束时间、结束时间分钟、结束时间秒、结束时间秒):
self.start=(开始时间*小时*60*60*1000)+(开始时间*分钟*60*1000)+(开始时间*秒*1000)+(开始时间*毫秒)#时间到毫秒
self.end=(end_hour*60*60*1000)+(end_min*60*1000)+(end_sec*1000)+(end_msec)#时间到毫秒
self.start_ind=(str(start_min)+':'+str(start_sec))
self.end_ind=(str(end_min)+':'+str(end_sec))
主要代码:

从pytube导入YouTube
从TimeSnip导入时间\u snip
时间\选项=输入(“您想按时间(1)还是按单词(2)查找?”)
url=”https://www.youtube.com/watch?v=vGwNPeEXEDM&ab_channel=SilasLaspada"
ytd=YouTube(URL)
定义时间_集(youtube_对象):
尝试:
hr_长度=整数(年初至今长度/3600)
最小长度=整数((年初至今长度%3600)/60)
秒长度=年初至今长度%60
打印(“视频是”+str(hr_长度)+':'+str(min_长度)+':'+str(sec_长度)+'long')
开始时间格式=输入(“以‘hr:min:sec,msec’格式输入开始时间:”)
结束时间格式=输入(“以‘hr:min:sec,msec’格式输入结束时间:”)
start\u parts=start\u time\u srt\u format.split(“:”)
end\u parts=end\u time\u srt\u format.split(“:”)
start_secmsec=start_parts[2]。拆分(“,”)
end_secmsec=end_零件[2]。拆分(“,”)
开始\u hr=int(开始\u部分[0])
start\u min=int(start\u零件[1])
开始秒=整数(开始秒[0])
start_msec=int(start_secmsec[1])
结束\u hr=int(结束\u部分[0])
end_min=int(end_零件[1])
结束秒=整数(结束秒[0])
end_msec=int(end_secmsec[1])
单词=(str(开始秒)+'-'+str(结束秒))
timeSnip=时间snip(开始时、开始时、开始秒、开始秒、结束时、结束时、结束秒、结束秒)
返回时间间隔
除索引器外:
打印(“无效输入!重试!”)
时间\u集(youtube\u对象)
如果时间_选项='1':
timeSnip=时间集(年初至今)
word=str(timeSnip.start/1000)+“秒”
elif time_options=='2':
word=输入(“输入word:”)

我不知道为什么会发生这种情况。

在except子句中,您不返回任何内容。因此,如果引发异常,您将再次调用该函数(这不是正确的方法),但即使该操作成功并返回值,您也会将其丢弃。将该行更改为
返回时间\u集(youtube\u对象)
,但最好使用while循环,而不是递归调用。

使用while循环是正确的。一个函数调用自己只是为了“回到开始”是完全错误的。谢谢你,蒂姆!我想知道,为什么我不应该使用递归?递归有它的位置,就像在数学编码或树搜索中一样,但它有开销。如果用户无法获得正确的格式,您可能会在这里深入很多层。从设计的角度来看,这应该是一个“循环直到数据有效”的模式。一般来说,最好避免递归。每次执行递归时,将向调用堆栈添加一个层。