我有一个下面给出的Python代码,当我运行这个全局名称时,未定义PDBAttributes

时间:2012-06-14 09:23:08

标签: python

#!/usr/bin/env python2.7 
##-*- mode:python;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t;python-indent:2 -*-'

import noesy
import argparse
import library

parser =argparse.ArgumentParser(description="read pdb file",
                                add_help=True)

parser.add_argument("file",help="protein pdb file")

library.add_standard_args( parser )
args = parser.parse_args()

def read_structure(pdbfile):
        struct=[]
        for line in pdbfile:
                if len(line):
                        struct.append(PDBAttributes.read_from_line(line))
        return struct

pdb=read_structure(open(args.file,'r'))

class PDBAttributes:
    def __init__(self, atomindex=1, atom=noesy.Atom(), atomx=1, atomy=1, atomz=1):
        self._atomindex=atomindex
        self._atom=atom
        self._atomx=atomx
        self._atomy=atomy
        self._atomz=atomz

        def __str__(self):
        s='ATOM %(_atomindex)d %(_atom)s at %(_atomx)8.3f %(_atomy)8.3f %(_atomz)8.3f'%self.__dict__
        return s

    def atom(self):
        return self._atom

    def atomindex(self):
        return self._atomindex

    def atomx(self):
        return self._atomx

    def atomy(self):
        return self._atomy

    def atomz(self):
        return self._atomz

    @classmethod
    def read_from_line(obj,line):
        tags=line.split()
        atomindex=int(tags[1])
        atom=noesy.Atom(tags[2],int(tags[5]))
        atomx=float(tags[6])
        atomy=float(tags[7])
        atomz=float(tags[8])
        obj=PDBAttributes(atomindex, atom, atomx, atomy, atomz)
        print obj

class AtomDistance(PDBAttributes):

    def distance(self, atom1,atom2):
        pass

2 个答案:

答案 0 :(得分:1)

移动您read_structure的来电,以遵循PDBAttributes类的定义。

另外,在重新格式化帖子的过程中,我看到你有缩进的标签和空格。尝试重新格式化代码以使用所有空格进行缩进,推荐的形式是4空格缩进。

你对所有这些getter函数的定义看起来像用Python编写的Java - 这是Python中经常不需要的许多额外代码。推荐的方法是省略这些所有他们做的分配属性与属性 - 同名但与领先 - 下划线方法,并只使用属性公共名称。请参阅Python is Not Java

答案 1 :(得分:1)

您获得的NameError是由于您将代码放入文件中的顺序。

当您致电read_structurepdb变量创建值时,它会尝试查找PDBAttributes,但尚未定义。如果您在文件中向下移动该行(在类定义下面),您将避免该错误。请注意,可以将read_structure的声明置于PDBAttributes类定义之上,但您可能希望将其降低以使代码更易于理解。

这是一段非常简单的代码,它演示了同样的错误:

def foo():
    print(foo_text)

foo() # raises a NameError

foo_text = "foo"

这是一个固定版本:

def foo():
    print(foo_text)

foo_text = "foo"

foo() # no error, prints "foo"