在Python中访问嵌套函数之外的对象

2024-05-19 20:54:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试做一个程序,它是一个有效的闹钟。这比它看起来要复杂得多,但这是有原因的,我不在这里讨论。但是,我遇到的问题是,我在一个嵌套函数中创建了一个报警对象,但是无论我做什么,我都不能让这个对象在这个函数之外被访问。。。我附上了下面的节略代码。在setAlarm之外对“check”或“set”等的任何调用都找不到“alarm”变量。请让我知道我做错了什么-我试着将变量声明为全局变量,正如您将看到的,但它仍然不起作用。。。在

谢谢!在

class Alarm(threading.Thread):
    def __init__(self, datetime, grace, close):
        super(Alarm, self).__init__()
        self.datetime = datetime
        self.grace = grace
        self.close = close
        self.keep_running = True

    def run(self):
        try:
            while self.keep_running:
                now = datetime.datetime.now()
                if now > self.datetime + datetime.timedelta(minutes=self.grace):
                    print "Oh no! It's %02d:%02d, which is %d minutes past your alarm time of %02d:%02d!" % (now.hour,now.minute,self.grace,self.datetime.hour,self.datetime.minute)
                    print "ALARM NOW!\a\a\a\a\a\a\a\a\a\a"
                    break
            time.sleep(10)
        except:
            return
    def just_die(self):
        self.keep_running = False

def setAlarm():
    print "What time would you like to set the alarm for? (in 00:00 military time please)"
    wakeup = raw_input()
    wakeuphour = int(wakeup[:2])
    wakeupmin = int(wakeup[3:])
    now = datetime.datetime.now()
    if now.hour > wakeuphour or (now.hour == wakeuphour and now.minute > wakeupmin):
        alarmday = now + datetime.timedelta(days=1)
        alarmtime = datetime.datetime(alarmday.year,alarmday.month,alarmday.day,wakeuphour,wakeupmin)
    else:
        alarmtime = datetime.datetime(now.year,now.month,now.day,wakeuphour,wakeupmin)
    close = 15
    grace = 5
    alarm = Alarm(alarmtime, grace, close)
    if alarmtime.day != now.day:
        print "Your alarm is set for %02d:%02d tomorrow." % (alarmtime.hour,alarmtime.minute)
    else:
        print "Your alarm is set for %02d:%02d today." % (alarmtime.hour, alarmtime.minute)

def runAlarm():
    setAlarm()
    alarm.start()
    while True:
        print "You can say 'stop', 'check', 'change', 'set', or 'quit'"
        text = str(raw_input())
        if text == "stop":
            if alarm != 0:
                alarm.just_die()
                alarm = 0
                print "Okay, I've cancelled the alarm."
            else:
                print "There was no alarm to stop..."
        elif text == "check":
            if alarm == 0:
                print "Sorry, you don't have any alarm set. To create an alarm, type 'set'"
            else:
                pass
        elif text == "change":
            pass
        elif text == "set":
            alarm = 0
            setAlarm()
            alarm.start()
        elif text == "quit":
            print "Sure thing. Bye bye!"
            break
        else:
            print "Sorry, I didn't understand that. Please try again."

Tags: textselfclosedatetimeifdefnowprint
1条回答
网友
1楼 · 发布于 2024-05-19 20:54:15

您已经将alarm创建为局部变量。默认情况下,函数中定义的变量是局部的,而local的意思就是它听起来只存在于函数内部。在

您可以通过显式地使其成为全局变量来解决这个问题。这不是个好主意,但这是最小的改变。只需将global alarm语句添加到setAlarm和每个要访问它的函数的顶部。在

更好的解决方案是从setAlarmreturn alarm。然后,在调用它的代码中,只存储返回值。例如:

def setAlarm():
    # your existing code
    return alarm

def runAlarm():
    alarm = setAlarm()
    # your existing code

现在,runAlarm有自己对同一对象的本地引用,也叫做alarm,所以它可以使用它。在

相关问题 更多 >