2015-07-19 3 views
1

Я бегу на Python 3, и я получаю следующее сообщение об ошибке:Python 3: Почему я получаю AttributeError?

AttributeError: 'AssemblyParser' object has no attribute 'hasMoreCommands' 

Вот код, который поднимает ошибку:

import sys 
from Parser import AssemblyParser 
from Code import Code 

parser = AssemblyParser(sys.argv[1]) 
translator = Code() 

out_file = str(sys.argv[1]).split(".") 
out_file = str(out_file[:1]) + ".hack" 

with open(out_file, 'w', encoding='utf-8') as f: 
    while parser.hasMoreCommands(): 
     parser.advance() 
     if parser.commandType() == "A_COMMAND": 
      dec_num = parser.symbol() 
      binary = "{0:b}".format(dec_num) 
     elif parser.commandType() == "C_COMMAND": 
      default_bits = "111" 
      comp_bits += translator.comp(parser.comp()) 
      dest_bits += translator.dest(parser.dest()) 
      jump_bits += translator.jump(parser.jump()) 
      binary = default_bits + comp_bits + dest_bits + jump_bits 
     assert len(binary) == 16 
     f.write(binary) 

Вот мой Parser.py файл:

class AssemblyParser: 
""" 
Encapsulates access to the input code. Reads an assembly language command, 
parses it, and provides convenient access to the command's components (fields and symbols). 
In addition, removes all whitespace and comments. 
""" 

def __init__(self, input_file): 
    self.current_command = "" 
    self.next_command = "" 
    with open(input_file,"r+", encoding='utf-8') as f: 
     for l in f: 
      line = "".join(l.split()) # Remove whitespace from the line 
      line = line.split('//') # Removes any comments from the line 
      clean_line = line[0] 
      if clean_line.strip(): # Removes any blank lines 
       f.write(clean_line) 
     next_command = f.readline() 


def __hasMoreCommands__(self): 
    if self.next_command: 
     return true 
    return false 


def __advance__(self): 
    with open(input_file, encoding='utf-8') as f: 
     self.current_command = self.next_command 
     self.next_command = f.readline() 


def __commandType__(self): 
    char_1 = self.current_command[:1] 
    if char_1 == "@": 
     return "A_COMMAND" 
    elif char_1 == "(": 
     return "L_COMMAND" 
    else: 
     return "C_COMMAND" 


def __symbol__(self): 
    assert self.commandType() == ("A_COMMAND" or "L_COMMAND") 

    if self.commandType() == "A_COMMAND": 
     symbol = str(symbol[1:]) 
    else: 
     symbol = str(symbol[1:len(symbol)-1]) 
    return str(symbol) 


def __dest__(self): 
    assert self.commandType() == "C_COMMAND" 

    if "=" in self.current_command: 
     temp = self.current_command.split("=") 
     return str(temp[:1]) 
    else: 
     return "" 


def __comp__(self): 
    assert self.commandType() == "C_COMMAND" 

    temp = self.current_command 

    if "=" in temp: 
     temp = temp.split("=") 
     temp = str(temp[1:]) 
    if ";" in temp: 
     temp = temp.split(";") 
     temp = str(temp[:1]) 
    return temp 


def __jump__(self): 
    assert self.commandType() == "C_COMMAND" 

    if ";" in self.current_command: 
     temp = self.current_command.split(";") 
     return str(temp[1:]) 
    else: 
     return "" 

Я действительно не знаю, почему я получаю эту ошибку, я просмотрел документацию по импорту, но я все больше запутался. Я довольно новичок в Python. Может ли кто-нибудь объяснить эту ошибку?

Спасибо.

+3

'hasMoreCommands' vs' __hasMoreCommands__' – falsetru

ответ

1

Хорошо. Кажется, в модуле Parser нет функции с именем hasMoreCommand. Функция там начинается с подчеркивания и заканчивается с подчеркиванием.

0

Для обозначения атрибутов «магия» используются два ведущих и завершающих символа подчеркивания. Вы не можете использовать это, чтобы создавать свои собственные, поскольку они ссылаются только на уже существующие методы.

Ниже то, что вы, вероятно, хотите:

hasMoreCommands(): 

Если у вас есть несколько классов с этой функцией, используйте имя коверкая вместо:

_hasMoreCommands(): 

См: https://stackoverflow.com/a/8689983/2030480

И: http://www.rafekettler.com/magicmethods.html