Forum Programmation.python Erreur de syntaxe Python

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
3
avr.
2019

Bonjour,

Je suis nouveau en programmation Python, et je rencontre le problème suivant :

Traceback (most recent call last):
File "/home/bernard/quickstart/quickinsert.py", line 75, in
event = service.events().insert(calendarId='primary', body=event).execute()
NameError: name 'service' is not defined

Ce nom semble pourtant définit.

Merci d'avance pour votre aide
Bernard

Mon code : (issu d'exemple sur le web)

from __future__ import print_function
import datetime
import pickle
import os.path
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
# SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
SCOPES = ['https://www.googleapis.com/auth/calendar']

def main():

    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('calendar', 'v3', credentials=creds)

    # Call the Calendar API
    now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
    events_result = service.events().list(calendarId='primary', timeMin=now,
                                        maxResults=200, singleEvents=True,
                                        orderBy='startTime').execute()
    events = events_result.get('items', [])

event = {
  'summary': 'Google I/O 2015',
  'location': '800 Howard St., San Francisco, CA 94103',
  'description': 'A chance to hear more about Google\'s developer products.',
  'start': {
    'dateTime': '2015-05-28T09:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'end': {
    'dateTime': '2015-05-28T17:00:00-07:00',
    'timeZone': 'America/Los_Angeles',
  },
  'recurrence': [
    'RRULE:FREQ=DAILY;COUNT=2'
  ],
  'attendees': [
    {'email': 'lpage@example.com'},
    {'email': 'sbrin@example.com'},
  ],
  'reminders': {
    'useDefault': False,
    'overrides': [
      {'method': 'email', 'minutes': 24 * 60},
      {'method': 'popup', 'minutes': 10},
    ],
  },
}

event = service.events().insert(calendarId='primary', body=event).execute()


if __name__ == '__main__':
    main()
  • # balise

    Posté par  . Évalué à 4.

    pour mettre du code, tu devrais utiliser le formattage (cf aide mémoire en dessous de la fenêtre de rédaction). Là, il faut ouvrir le bloc de code avec ```python et le fermer avec ```. En l'état, c'est illisible
    ```

  • # indentation

    Posté par  (site web personnel) . Évalué à 1.

    Pas facile de s'y retrouver avec cette mise en forme…
    Est ce que tu as bien mis une indentation à la ligne 75? Car sinon, la ligne ne fait pas partie de la fonction main(), et donc l'objet "service" n'existe effectivement pas à cet instant (il n'existe que dans main() ).

    Un LUG en Lorraine : https://enunclic-cappel.fr

    • [^] # Re: indentation

      Posté par  . Évalué à 2.

      Pas facile de s'y retrouver avec cette mise en forme…

      j'ai edité son post pour y mettre les bonnes balises,
      j'espere que les indentations sont bien restées

      • [^] # Re: indentation

        Posté par  (site web personnel) . Évalué à 3.

        Q? Quelle version de Python (si pas de contrainte, dégager Python2) ?

        Si l'indentation est correcte, le

        event = service.events().insert(calendarId='primary', body=event).execute()

        Qui est tout à la fin, est dans l'espace de noms du module et est exécuté avant l'appel à main(). Comme c'est avant l'appel, service qui est créé par main() n'existe pas encore. Et comme c'est défini hors de la fonction, la variable locale n'est de toute façon pas visible (et n'existe plus après le retour de la fonction).

        Q? pourquoi reload(sys) et sys.setdefaultencoding('utf8') ? S'il y a des décodages à faire à certains moments, c'est nettement mieux de les faire explicitement là où on en a besoin plutôt que de jouer avec un aspect auto-magique (pour les sources il y a la directive en début de fichier, et en Python c'est utf8 par défaut). Et passer à Python 3 permet d'avoir une bonne séparation entre des tableaux d'octets et des chaînes de caractères — c'est un des gros apports du changement majeur de version.

        Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.