Командата не е дефинирана в Python - истински основи, но объркана!

Написах този кратък скрипт (от който премахнах някои незначителни подробности за размера) и получавам много проста грешка, но не разбирам защо! Аз съм много нов в Python, така че може би някой може да обясни проблема и защо не работи?

Грешката изглежда пада, когато искам да отпечатам пълния потребителски сериен низ за запис обратно в конзолата, изглежда не разпознава аргументите, които изпратих на функцията.

Може би съм разбрал нещо много просто. Трябва да е просто за всеки, дори и с най-малкото разбиране на Python

наздраве

Кодът:

#! /usr/bin/env python

# IMPORTS APPEAR HERE ***

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=115200,
    parity='N',
    stopbits=1,
    bytesize=8
)

# Sets motor number
motor_no = "2"

# Lets create our main GUI class
class ArialApp(object):
    # Default init stuff
    def __init__(self):
        # Create a builder object and create the objects from the .glade file
        self.builder = gtk.Builder()
        self.builder.add_from_file("../res/main.glade")
        self.builder.connect_signals(self)

        # Open the serial connection to the encoder and keep it open
        ser.open()

        # Custom function for sending commands down the serial. Needed to wrap defaults
        # arround the custom 'serial.write' command.
        self.send_command('A')

        # Code removed for space..... 

    # Custom method for sending commands down serial with default ammendments
    def send_command(self, nanotech):
        # Send the command with the #, then motor number which should be global, then the command
        # sent the the method followed by a return
        ser.write("#" + motor_no + nanotech + '\r\n')

        # Print to the console the full command sent down the pipe
        # [[[ ERROR GOES HERE ]]]
        print "#" + motor_no + nanotech + '\r\n'

# Just to show its in here...
if __name__ == "__main__":
    app = ArialApp()
    gtk.main()

Грешката:

File "main.py", line 62, in ArialApp
    print "#" + motor_no + commands + '\r\n'
NameError: name 'commands' is not defined

И накрая, само за да хвърля малко контекст върху ситуацията:

Пиша малко GUI приложение в Glade и Python / PyGTK за управление на стъпков двигател по сериен път с помощта на модула PySerial. Въпреки това, бих искал да опаковам собствената си функция "write", така че да мога да добавя стойности по подразбиране към "send" по кабела. Например, номерът на двигателя и винаги добавянето се връща в края на инструкциите. Други неща, като четене на отговора веднага в същата функция, също биха били полезни за измерване на отговорите, така че опаковането му в персонализирана функция изглеждаше като разумно нещо.

Всеки съвет или помощ относно горното ще бъде оценен.

Любезно ви благодаря.

Анди

АКТУАЛИЗАЦИЯ: Имам адреси към първоначалния проблем с невключването на „self“ и успях да накарам Stack да приеме разделите, които обикновено използвам, така че е по-чист за гледане. Също така исках да отбележа, че единственият код, който премахнах, беше проста настройка на променлива. Проблемът обаче продължава!


person Schodemeiss    schedule 30.06.2010    source източник
comment
Заглавието на вашата тема е леко подвеждащо; не че дадена команда не е дефинирана, но променливата commands не е дефинирана във вашия send_command метод. Не съм сигурен обаче защо се случва това. Ще го разгледам по-дълбоко. Опитахте ли да използвате различно име за аргумента? може би го сменете с foo и вижте дали все още работи.   -  person Justin L.    schedule 30.06.2010
comment
Каква е действителната грешка, след като актуализирахте кода? Не успява ли да намери nanotech или motor_no?   -  person Daniel Roseman    schedule 30.06.2010


Отговори (3)


Може да е, защото пропускате аргумента за себе си:

  def send_command(self, commands):
person Ryan Ginstrom    schedule 30.06.2010

имате грешка при отстъпа в def send_command(commands):

и първият ви параметър трябва да бъде "self":

class ArialApp(object):

<snap>

    def send_command(self, commands):
        ser.write("#" + motor_no + commands + '\r\n')
person dzen    schedule 30.06.2010
comment
Странно, оказа се, че има нещо странно с табулацията, използвана в моя код, след като буквално го написах отново, работи добре! Трябва да е бил проблем с разстоянието. Можете ли да предложите добра Python IDE, различна от Eclipse, която очевидно не е добра?! - person Schodemeiss; 30.06.2010
comment
Използвам vim / gvim или textmate (на macos). ще намерите някои въпроси за python ide на този уебсайт :) - person dzen; 01.07.2010

Първо, трябва да използвате повече от едно пространство за отстъп. Бялото пространство е значително в Python и е много трудно да се види, че сте го направили правилно, ако използвате само едно пространство. Четири е обикновено приетата сума.

Основният проблем с вашия send_command метод е, че сте забравили, че първият аргумент на всеки метод в Python е (по конвенция) self. Така че подписът трябва да бъде:

def send_command(self, commands):

Кодът, който показахте обаче, няма да даде грешката, която посочвате: вместо това ще даде това:

TypeError: send_command() takes exactly 1 argument (2 given)

Освен това във вашия метод не е commands, което не е дефинирано, а motor_no. Ето защо винаги е важно да показвате действителния код, който изпълнявате, достатъчно съкратен, за да възпроизведете действително грешката.

person Daniel Roseman    schedule 30.06.2010