#!/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
答案 0 :(得分:1)
移动您read_structure
的来电,以遵循PDBAttributes
类的定义。
另外,在重新格式化帖子的过程中,我看到你有缩进的标签和空格。尝试重新格式化代码以使用所有空格进行缩进,推荐的形式是4空格缩进。
你对所有这些getter函数的定义看起来像用Python编写的Java - 这是Python中经常不需要的许多额外代码。推荐的方法是省略这些所有他们做的分配属性与属性 - 同名但与领先 - 下划线方法,并只使用属性公共名称。请参阅Python is Not Java。
答案 1 :(得分:1)
您获得的NameError
是由于您将代码放入文件中的顺序。
当您致电read_structure
为pdb
变量创建值时,它会尝试查找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"