从“循环”返回“无”

时间:2013-09-03 04:27:15

标签: python

我有以下功能:

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)

3 个答案:

答案 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的第一个迭代中,Noneif条件,因此它会测试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循环会失败。