来自每个循环的Python未定义函数

时间:2012-07-18 15:36:26

标签: python undefined

我在这里是一个完整的python n00b,只是尝试将几个位混合在一起以使项目工作,但我正在努力学习一些我认为的语法。

这是我到目前为止的脚本:

#!/usr/bin/env python

from plugin import *
from siriObjects.systemObjects import ResultCallback
import uuid
import json
import random
import types
import urllib
import urllib2
import random
import re
import select
import socket
import struct
import sys
import thread
import time

class tivoRemote(Plugin):

        tivo_address = '192.168.0.9'
        tivo_name = ''
        tivo_swversions = {}
        have_zc = True
        captions_on = False
        sock = None
        outer = None


        def connect():
            """ Connect to the TiVo within five seconds or report error. """
            global sock
            try:
                sock = socket.socket()
                sock.settimeout(5)
                sock.connect((tivo_address, 31339))
                sock.settimeout(None)
            except Exception, msg:
                msg = 'Could not connect to %s:\n%s' % (tivo_name, msg)
                print(msg)

        def send(message):
            """ The core output function, called from irsend(). Re-connect if
                necessary (including restarting the status_update thread), send
                message, sleep, and check for errors.
                """

            if not sock:
                self.connect()
                thread.start_new_thread(status_update, ())
            try:
                sock.sendall(message)
                time.sleep(0.1)
            except Exception, msg:
                error_window(str(msg))


        def irsend(*codes):
            """ Expand a command sequence for send(). """
            for each in codes:
                self.send('IRCODE %s\r' % each)


        @register("en-US", ".*Change.*Channel.*")
        def channelChanger(self, speech, language, matchedRegex):
                if language == 'en-US':
                        answer = self.ask(u"Which channel would you like?")
                        self.say(u"Ok, one moment..".format(answer))
                        self.connect()
                        self.irsend(answer)
                self.complete_request()

我得到的错误是:

Traceback (most recent call last):
  File "/home/pi/SiriServerCore/plugin.py", line 150, in run
    self.__method(self, self.__speech, self.__lang,        self.__method.__dict__[__criteria_key__][self.__lang].match(self.__speech))
  File "/home/pi/SiriServerCore/plugins/tivoRemote/__init__.py", line 70, in     channelChanger
    self.irsend(format(answer))
  File "/home/pi/SiriServerCore/plugins/tivoRemote/__init__.py", line 61, in irsend
    self.send('IRCODE %s\r' % each)
NameError: global name 'self' is not defined

如果我删除'自我'。我得到了同样的错误但是没有定义'send'。

提前感谢您的帮助:) 莱恩

4 个答案:

答案 0 :(得分:3)

更有可能工作:

class tivoRemote(Plugin):

    def __init__(self):
        self.tivo_address = '192.168.0.9'
        self.tivo_name = ''
        self.tivo_swversions = {}
        self.have_zc = True
        self.captions_on = False
        self.sock = None
        self.outer = None


    def connect(self):
        """ Connect to the TiVo within five seconds or report error. """
        try:
            sock = socket.socket()
            sock.settimeout(5)
            sock.connect((tivo_address, 31339))
            sock.settimeout(None)
        except Exception, msg:
            msg = 'Could not connect to %s:\n%s' % (tivo_name, msg)
            print(msg)
        self.sock = sock

    def send(self, message):
        """ The core output function, called from irsend(). Re-connect if
            necessary (including restarting the status_update thread), send
            message, sleep, and check for errors.
        """

        if not self.sock:
            self.connect()
            thread.start_new_thread(status_update, ()) # status_update must be some global at this point
        try:
            self.sock.sendall(message)
            time.sleep(0.1)
        except Exception, msg:
            error_window(str(msg))


    def irsend(self, *codes):
        """ Expand a command sequence for send(). """
        for each in codes:
            self.send('IRCODE %s\r' % each)


    @register("en-US", ".*Change.*Channel.*")
    def channelChanger(self, speech, language, matchedRegex):
            if language == 'en-US':
                    answer = self.ask(u"Which channel would you like?")
                    self.say(u"Ok, one moment..".format(answer))
                    self.connect()
                    self.irsend(answer)
            self.complete_request()

在定义方法时需要使用self,并且必须使用它来访问当前实例。

答案 1 :(得分:1)

您需要定义所有实例方法(使用self.访问)并以self作为第一个参数,您将习惯它:

class tivoRemote(Plugin):

    tivo_address = '192.168.0.9'
    tivo_name = ''
    tivo_swversions = {}
    have_zc = True
    captions_on = False
    sock = None
    outer = None


    def connect(self):
        """ Connect to the TiVo within five seconds or report error. """
        global sock
        try:
            sock = socket.socket()
            sock.settimeout(5)
            sock.connect((tivo_address, 31339))
            sock.settimeout(None)
        except Exception, msg:
            msg = 'Could not connect to %s:\n%s' % (tivo_name, msg)
            print(msg)

    def send(self, message):
        """ The core output function, called from irsend(). Re-connect if
            necessary (including restarting the status_update thread), send
            message, sleep, and check for errors.
            """

        if not sock:
            self.connect()
            thread.start_new_thread(status_update, ())
        try:
            sock.sendall(message)
            time.sleep(0.1)
        except Exception, msg:
            error_window(str(msg))


    def irsend(self, *codes):
        """ Expand a command sequence for send(). """
        for each in codes:
            self.send('IRCODE %s\r' % each)


    @register("en-US", ".*Change.*Channel.*")
    def channelChanger(speech, language, matchedRegex):
            if language == 'en-US':
                    answer = self.ask(u"Which channel would you like?")
                    self.say(u"Ok, one moment..".format(answer))
                    self.connect()
                    self.irsend(answer)
            self.complete_request()

此外,如果您希望这些属性属于实例,而不是类(如静态属性),则必须在构造(__init__中定义它们,这是您最接近构造的内容):

class tivoRemote(Plugin):
    def __init__(self):
        self.tivo_address = '192.168.0.9'
        self.tivo_name = ''
        self.tivo_swversions = {}
        self.have_zc = True
        self.captions_on = False
        self.sock = None
        self.outer = None

答案 2 :(得分:1)

您正在创建的成员变量属于类而不是实例(您在类中定义变量的方式)。如果要从实例调用send()之类的方法,那么这些函数的第一个参数必须是self。您需要修改整个代码,如下所示:

class tivoRemote(..):
    def __init__(self):
        self.tivo_address = '192.168.0.9'
        self.tivo_name = '' #and so on for other members
        ....

    def send(self, msg):
        self.connect()
        self.sendall(..)

    def connect(self, ...):
        #self.sock
        self.sock = socket.socket()
        ....

    #and similar for all other method that you think is a part of "instance" add the 
    #first parameter as self

答案 3 :(得分:0)

说明:

class MyThing(object):
    """I am a class definition

    Everything here is part of the class definition.

    Methods here are classmethods, they are considered "unbound"

    When you create an instance of this class like so:
        my_instance_of_class_MyThing = MyThing()

    the "my_instance_of_class_MyThing" now points to an object.

    that object is an instance object.

    that object is an instance object of MyThing

    the "my_instance_of_class_MyThing" now points to an instance object.

    the methods contained in the instance object are NOW "bound" to the instance

    bound methods are bound to an instance object

    bound methods are sent a reference to the thing they are bound too by
       python itself when they are called.
    """

    i_am_a_class_attribute = "I am a class attribute"

    def __init__(self):

        """ I am a method. I start my life as a class method unbound to
        any instance. Because I am unbound, when you call me I will
        complain to you in the form of an unbound exception call, thus
        likely crashing your application.

        When you create an instance the class I was defined in, 
        I will copy a bound copy of myself into the newly created instance.
        When you call the bound copy of myself, Python will politely send
        a reference of the instance object to the bound method as its 
        very first argument. Many people name that varible "self". Some use
        "me". Others programmers break with convention and use a 
        single character, but this is rare. 
        """


        i_am_a_init_local_reference_to = 
            "this string and only visible with in __init__()"


        # self is a variable name python sends to mything_instance.__init__() as the first argument
        # self points to the same thing mything_instance points to, 
        #     an INSTANCE of the class MyThing

        self.i_am_an_instance_reference_to = 
            '''this string and is visible to everthing that can access what "self" points too.'''


    def proof(self):
        try:
            print i_am_a_init_local_reference_to
        except AttributeError, error_message:
            print error_message
        else:
            print "This won't happen !!"
            print "It successfully printed i_am_a_init_local_reference_to"

        try:
            print self.i_am_an_instance_reference_to
        except AttributeError, error_message:
            print error_message
        else:
            print """See proof() can access self.i_am_an_instance_reference_to"""

希望这有助于那些不知道解决方案原因的人。