2013-10-04 34 views
8

Sadece yapmak istediğim, tek bir API'dan firstevent'i göstermektir. Değişken “firstevent” olarak adlandırılır ve değer web sayfasında gösterilmelidir. Ancak itfaiyeci bir def'in içinde, bu yüzden onu global bir değişkene dönüştürüyorum ve farklı işlevlerde kullanılabileceğini umuyorum. Fakat “NameError: global name 'firstevent' tanımlı değil” ifadesini gösteriyor. Bu yapıyorum budur:Genel değişken ve python şişesi

global firstevent 

bu değişkene rasgele bir değer göndermek global değişkeni tanımlamak, bu web sitesinde BirinciOlay değerini gösteren events['items'][1]['end']

firstevent = 1 

olması gerekiyordu.

@app.route("/") 
def index(): 
    return 'User %s' % firstevent 

Şu an neler olduğundan emin değilim, belki de bir kapsam sorunu var mı? İnternette birçok cevabı kontrol ettim ama yine de çözümü bulamıyorum.

İşte ayrıntılar (tamamını değil kod)

import os 

# Retrieve Flask, our framework 
# request module gives access to incoming request data 
import argparse 
import httplib2 
import os 
import sys 
import json 

from flask import Flask, request 
from apiclient import discovery 
from oauth2client import file 
from oauth2client import client 
from oauth2client import tools 

from apiclient.discovery import build 
from oauth2client.client import OAuth2WebServerFlow 

import httplib2 

global firstevent 
app = Flask(__name__) 

def main(argv): 
    # Parse the command-line flags. 
    flags = parser.parse_args(argv[1:]) 

    # If the credentials don't exist or are invalid run through the native client 
    # flow. The Storage object will ensure that if successful the good 
    # credentials will get written back to the file. 
    storage = file.Storage('sample.dat') 
    credentials = storage.get() 
    if credentials is None or credentials.invalid: 
    credentials = tools.run_flow(FLOW, storage, flags) 

    # Create an httplib2.Http object to handle our HTTP requests and authorize it 
    # with our good Credentials. 
    http = httplib2.Http() 
    http = credentials.authorize(http) 

    # Construct the service object for the interacting with the Calendar API. 
    calendar = discovery.build('calendar', 'v3', http=http) 
    created_event = calendar.events().quickAdd(calendarId='[email protected]', text='Appointment at Somewhere on June 3rd 10am-10:25am').execute() 
    events = calendar.events().list(calendarId='[email protected]').execute() 
    #firstevent = events['items'][1]['end'] 

    firstevent = 1 
    #print events['items'][1]['end'] 

# Main Page Route 
@app.route("/") 
def index(): 
    return 'User %s' % firstevent 


# Second Page Route 
@app.route("/page2") 
def page2(): 
    return """<html><body> 
    <h2>Welcome to page 2</h2> 
    <p>This is just amazing!</p> 
    </body></html>""" 


# start the webserver 
if __name__ == "__main__": 
    app.debug = True 
    app.run() 

cevap

15

Evet, bu bir kapsam problem vardır. senin main() fonksiyonun başında bu ekleyin: yapmış olmalıdır

global firstevent 

. Bir işlev içinde tanımlanmayan değişkenler globaldir. Herhangi bir işlevden doğrudan erişebilirsiniz. Ancak, değişkeni değiştirmek için fonksiyonunuza global var yazmanız gerekir.

Örnek

Bu fonksiyonun bir yerel değişken "BirinciOlay" oluşturur:

firstevent = 0 
def modify(): 
    firstevent = 1 

Ve bu küresel değişkeni 'BirinciOlay'

firstevent = 0 
def modify(): 
    global firstevent 
    firstevent = 1 
+0

Evet değiştirir, sen 'var global firstevent' * dışında * herhangi bir işlev. Bu böyle çalışmıyor. – kindall