我有以下功能:
def AdjustTime(f):
if len(f) == 1:
return '0' + f + '00'
elif len(f) == 2:
return f + '00'
elif len(f) == 3:
return '0' + f
elif len(f) == 4:
return f
else:
while True:
if len(f) > 0 and len(f) <= 4 and int(f[:2]) <= 23 and int(f[2:]) <= 59:
return f
break
else:
clear()
print f,'Get this date right'
f = raw_input('')
它一直有效,直到我得到一个正确的数字,这导致了一个TypeError:'NoneType'对象不是可下标的。如何解决这个问题?
编辑:首先,感谢括号提及,我在编写自己时忘了几次,现在代码就是我实际尝试的那个。
我想把Drafts带来的一串文字放到这个函数中,if / elif会将1-2-3的字符串转换为我需要的4位数字以及我想要的方式。例如,字符串“1”将变为“0100”。但你知道。如果用户搞砸了,我正在使用它。是的,我应该以其他方式重新组织它,例如在实际尝试编辑字符串之前使用int(f[:2]) <= 23 and int(f[2:]) <= 59
。
回到正轨,如果用户搞砸了,输入使他有机会插入正确的字符串,该字符串经过一段时间。问题是,当用户输入正确的值时,print f
显示的是{12}:
1234
None
现在,我还能做些什么来帮助你?
EDIT2:既然每个人都在询问整个代码,那么你就是在这里帮助我,我只是觉得没有必要。为此道歉(:
from urllib import quote
import time
from webbrowser import open
from console import clear
rgv = ['a path', 'This is an awesome reminder\nWith\nMultiple\nLines.\nThe last line will be the time\n23455']
a = rgv[1].split('\n')
reminder = quote('\n'.join(a[:(len(a)-1)]))
t = a[len(a)-1]
def AdjustTime(f):
if len(f) == 1:
return '0' + f + '00'
elif len(f) == 2:
return f + '00'
elif len(f) == 3:
return '0' + f
elif len(f) == 4:
return f
else:
while True:
if len(f) > 0 and len(f) <= 4 and int(f[:2]) <= 23 and int(f[2:]) <= 59:
return f
break
else:
clear()
print 'Get this date right'
f = raw_input('')
mins = int(AdjustTime(t)[:2])*60 + int(AdjustTime(t)[2:])
local = (time.localtime().tm_hour*60+time.localtime().tm_min)
def findTime():
if local < mins:
return mins - local
else:
return mins - local + 1440
due = 'due://x-callback-url/add?title=' + reminder + '&minslater=' + str(findTime()) + '&x-source=Drafts&x-success=drafts://'
open(due)
答案 0 :(得分:3)
def AdjustTime(f):
f = f or "" # in case None was passed in
while True:
f = f.zfill(4)
if f.isdigit() and len(f) == 4 and int(f[:2]) <= 23 and int(f[2:]) <= 59:
return f
clear()
print f, 'Get this date right'
f = raw_input('')
答案 1 :(得分:0)
您需要将f初始化为""
。在while True
f的第一个迭代中,None
是if
条件,因此它会测试None[:2]
和None[2:]
,这显然会引发错误。
object of type 'NoneType' has no len()
首先出错....
答案 2 :(得分:0)
在方法的顶部,添加以下内容:
def AdjustTime(f):
if not f:
return
如果您将方法传递给"falsey" value,这将阻止该方法执行。
但是,为了做到这一点,你需要改变你的逻辑,在这个函数的调用者中有raw_input
行;因为上面的方法将返回,并且永远不会显示提示:
def AdjustTime(f):
if not f:
return
if len(f) == 1:
return '0' + f + '00'
if len(f) == 2:
return f + '00'
if len(f) == 3:
return '0' + f
if len(f) == 4:
return f
if 0 > len(f) <= 4 and int(f[:2]) <= 23 and int(f[2:] <= 59:
return f
def get_input():
f = raw_input('')
result = AdjustTime(f)
while not result:
print('{} get this date right'.format(f))
f = raw_input('')
result = AdjustTime(f)
@gnibbler在评论中有一个很好的建议:
def AdjustTime(f):
f = f or ""
如果传入的值为falsey,则会将f
的值设置为空字符串。这种方法的好处是你的if循环仍然会运行(因为空字符串有长度),但你的while循环会失败。