Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 if语句不捕获None_Python_If Statement - Fatal编程技术网

Python if语句不捕获None

Python if语句不捕获None,python,if-statement,Python,If Statement,我正在为经验公式编写一个语法控制器。它似乎运行得相当好,但有一个错误我似乎无法修复 代码如下: import string from linkedQFile import LinkedQ ATOMER = ["H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar"] class Formelfel(Exception): pass def readFormel(): i

我正在为经验公式编写一个语法控制器。它似乎运行得相当好,但有一个错误我似乎无法修复

代码如下:

import string
from linkedQFile import LinkedQ

ATOMER = ["H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar"]

class Formelfel(Exception):
    pass

def readFormel():
    if q.peek() == None:
        print("Formel saknas. ")
    readMol()
    print("Formeln är syntaktiskt korrekt")
    #newline check?

def readMol():
    if q.peek() == None:
        return
    readGroup()
    readMol()
    return

def readGroup():
    if q.peek() == "(":
        print(q.get(), end="")
        if q.peek() in string.ascii_lowercase or q.peek() in string.ascii_uppercase:
            readMol()
        else:
            raise Formelfel
    if q.peek() == ")":
        print(q.get(), end="")
        readNum()
        return
    readAtom()
    try: 
        readNum()
    except Formelfel:
        pass
    return

def readAtom():
    X = readLetter()
    try:
        x = readletter() 
    except Formelfel:
        x = ""
    atom = X+x
    if atom in ATOMER:
        return
    rest=""
    while not q.isEmpty():
        rest += print(q.get(), end="")
    raise Formelfel("Okänd atom vid radslutet "+rest)

def readNum():
    try:
        if q.peek() != None:
            print(q.peek())
            while not q.peek() in string.ascii_uppercase and not q.peek() in string.ascii_lowercase and not q.peek() == "(" and not q.peek()==")": # If q.peek() is a number
                if q.peek() == None:
                    return
                int(q.get())    
        return
    except:
        raise Formelfel

def readLetter():
    if q.peek() in string.ascii_uppercase:
        x =q.get()
        print(x,end="")
        return x
    raise Formelfel

def readletter():
    if q.peek() == None:
        raise Formelfel
    if q.peek() in string.ascii_lowercase:
        x =q.get()
        print(x,end= "")
        return x
    raise Formelfel

formel= "Si(C3(COOH)2)4(H2O)7"
q = LinkedQ()
for symbol in formel:
    q.put(symbol)

readFormel()
我得到以下输出和错误:

Si(
(C3
(CO
OO
OH
H)
)2
)4
(H2
O)
)7
Traceback (most recent call last):
  File "formelkoll.py", line 59, in readNum
    while not q.peek() in string.ascii_uppercase and not q.peek() in string.ascii_lowercase and not q.peek() == "(" and not q.peek()==")": # If q.peek() is a number
TypeError: 'in <string>' requires string as left operand, not NoneType

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "formelkoll.py", line 88, in <module>
    readFormel()
  File "formelkoll.py", line 12, in readFormel
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 19, in readMol
    readGroup()
  File "formelkoll.py", line 27, in readGroup
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 19, in readMol
    readGroup()
  File "formelkoll.py", line 27, in readGroup
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 19, in readMol
    readGroup()
  File "formelkoll.py", line 27, in readGroup
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 20, in readMol
    readMol()
  File "formelkoll.py", line 19, in readMol
    readGroup()
  File "formelkoll.py", line 32, in readGroup
    readNum()
  File "formelkoll.py", line 65, in readNum
    raise Formelfel
__main__.Formelfel

在发生错误的行之前。换句话说,为什么不允许任何人跳过这个if语句?

我明白了。正如一位评论者所说,调用了q.get(),这改变了q.peek()的值。两行的切换解决了这个问题

def readNum():
    try:
        if q.peek() != None: #Vrf får vi error NoneType trots detta??
            print(q.peek())
            while not q.peek() in string.ascii_uppercase and not q.peek() in string.ascii_lowercase and not q.peek() == "(" and not q.peek()==")": 
                int(q.get())    
                if q.peek() == None: 
                    return

        return
    except:
        raise Formelfel

调用
q.get()
后,由
q.peek()
返回的值将不同。顺便说一句,下次,尝试将错误减少到SSCCE(“简短、自包含、正确的示例”)或MVCE(“最小、正确、可验证的示例”);如果添加的代码超过了重现错误所需的最小数量,其他人就很难提供帮助,而将错误减少到最小组件的过程很可能有助于您自己解决问题。如果在您的情况下使用一个以1字符字符串为单位的辅助函数,则代码的可读性会更高参数并返回True或False。。。
def readNum():
    try:
        if q.peek() != None: #Vrf får vi error NoneType trots detta??
            print(q.peek())
            while not q.peek() in string.ascii_uppercase and not q.peek() in string.ascii_lowercase and not q.peek() == "(" and not q.peek()==")": 
                int(q.get())    
                if q.peek() == None: 
                    return

        return
    except:
        raise Formelfel