2012-04-20 38 views
13

IndentationError:意外unindent为什么?IndentationError:意外unindent为什么?

#!/usr/bin/python 
import sys 
class Seq: 
    def __init__(self, id, adnseq, colen): 
     self.id  = id 
     self.dna = adnseq 
     self.cdnlen = colen 
     self.prot = "" 
    def __str__(self): 
     return ">%s\n%s\n" % (self.id, self.prot) 
    def translate(self, transtable): 
     self.prot = "" 
     for i in range(0,len(self.dna),self.cdnlen): 
      codon = self.dna[i:i+self.cdnlen] 
      aa = transtable[codon] 
      self.prot += aa 
    def parseCommandOptions(cmdargs): 
     tfname = cmdargs[1] 
     sfname = cmdargs[2] 
     return (tfname, sfname) 
    def readTTable(fname): 
     try: 
      ttable = {} 
      cdnlen = -1 
      tfile = open(fname, "r") 
      for line in tfile: 
       linearr = line.split() 
       codon = linearr[0] 
       cdnlen = len(codon) 
       aa  = linearr[1] 
       ttable[codon] = aa 
      tfile.close() 
      return (ttable, cdnlen) 
    def translateSData(sfname, cdnlen, ttable): 
     try: 
      sequences = [] 
      seqf = open(seq_fname, "r") 
      line = seqf.readline() 
      while line: 
       if line[0] == ">": 
        id = line[1:len(line)].strip() 
        seq = "" 
        line = seqf.readline() 
        while line and line[0] != '>': 
         seq += line.strip() 
         line = seqf.readline() 
        sequence = Seq(id, seq, cdnlen) 
        sequence.translate(ttable) 
        sequences.append(sequence) 
      seqf.close() 
      return sequences  
    if __name__ == "__main__": 
     (trans_table_fname, seq_fname) = parseCommandOptions(sys.argv) 
     (transtable, colen) = readTTable(trans_table_fname) 
     seqs = translateSData(seq_fname, colen, transtable) 
     for s in seqs: 
      print s 

它说:

def translateSeqData(sfname, cdnlen, ttable): 
^
IndentationError: unexpected unindent 

为什么?我检查了数千次,我找不到问题。我只使用Tabs,没有空格。另外,有时它会要求定义这个类。这可以吗?

+0

类中的所有方法/函数也需要'self'作为它们的第一个参数,除非您使用了'staticmethod'或'classmethod'装饰器。 – agf 2012-04-20 03:10:56

回答

43

这是因为你有:

def readTTable(fname): 
    try: 

没有try:块之后匹配的except块。每个try必须至少有一个匹配的except

请参阅Python教程的Errors and Exceptions部分。

+0

当然,呃​​! – John 2012-04-20 03:21:56

+0

你怎么知道的,甚至没有看到这个测试语句?! – Pacane 2012-08-10 16:07:23

+0

@Pacane如果你点击“编辑Apr 20 at 22:56”,你可以看到编辑历史。原始版本有更多的代码。 – agf 2012-08-10 17:50:26

1

您没有完成您的try声明。你也需要和except在那里。

0

该错误实际上可能出现在报告错误的代码之前。例如,如果您的语法错误如下所示,您将收到缩进错误。语法错误实际上是在“except”旁边,因为它后面应该包含一个“:”。

try: 
    #do something 
except 
    print 'error/exception' 


def printError(e): 
    print e 

如果您将“except”改为“except:”,错误将消失。

祝你好运。

+0

嗨。如果您在编辑之前查看我的答案以及问题的原始版本,则可以看到这已被涵盖。此外,您需要将代码缩进四个空格(或使用编辑框顶部的代码按钮)才能正确格式化。 – agf 2012-08-10 17:49:27