2015-12-07 1 views
-1

J'essaie d'utiliser ce script pour mettre en place le père Noël secret. J'ai modifié quelques lignes pour qu'il soit compatible avec python 3 mais quand je l'exécute (sous python2 et python3) j'obtiens une erreur de syntaxe.Python Si déclaration syntaxe invalide, mais l'indentation est correcte

Voici une partie de mon code:

def main(argv=None): 
    if argv is None: 
     argv = sys.argv 
    try: 
     try: 
      opts, args = getopt.getopt(argv[1:], "shc", ["send", "help"]) 
     except getopt.error: 
      raise Usage(msg) 

     # option processing 
     send = False 
     for option, value in opts: 
      if option in ("-s", "--send"): 
       send = True 
      if option in ("-h", "--help"): 
       raise Usage(help_message) 

     config = parse_yaml() 
     for key in REQRD: 
      if key not in config.keys(): 
       raise Exception(
        'Required parameter %s not in yaml config file!' % (key,)) 

     participants = config['PARTICIPANTS'] 
     dont_pair = config['DONT-PAIR'] 
     if len(participants) < 2: 
      raise Exception('Not enough participants specified.') 

     givers = [] 
     for person in participants: 
      name, email = re.match(r'([^<]*)<([^>]*)>', person).groups() 
      name = name.strip() 
      invalid_matches = [] 
      for pair in dont_pair: 
       names = [n.strip() for n in pair.split(',')] 
       if name in names: 
        # is part of this pair 
        for member in names: 
         if name != member: 
          invalid_matches.append(member) 
      person = Person(name, email, invalid_matches) 
      givers.append(person) 

     recievers = givers[:] 
     pairs = create_pairs(givers, recievers) 
     if not send: 
      print(""" 
Test pairings: 

%s 

To send out emails with new pairings, 
call with the --send argument: 
    $ python secret_santa.py --send 

      """ % ("\n".join([str(p) for p in pairs])) 

     if send: 
      server = smtplib.SMTP(config['SMTP_SERVER'], config['SMTP_PORT']) 
      server.starttls() 
      server.login(config['USERNAME'], config['PASSWORD']) 
     for pair in pairs: 
      zone = pytz.timezone(config['TIMEZONE']) 
      now = zone.localize(datetime.datetime.now()) 
      date = now.strftime('%a, %d %b %Y %T %Z') # Sun, 21 Dec 2008 06:25:23 +0000 
      message_id = '<%[email protected]%s>' % (str(time.time())+str(random.random()), socket.gethostname()) 
      frm = config['FROM'] 
      to = pair.giver.email 
      subject = config['SUBJECT'].format(santa=pair.giver.name, santee=pair.reciever.name) 
      body = (HEADER+config['MESSAGE']).format(
       date=date, 
       message_id=message_id, 
       frm=frm, 
       to=to, 
       subject=subject, 
       santa=pair.giver.name, 
       santee=pair.reciever.name, 
      ) 
      if send: 
       result = server.sendmail(frm, [to], body) 
       print "Emailed %s <%s>" % (pair.giver.name, to) 

     if send: 
      server.quit() 

    except Usage, err: 
     print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg) 
     print >> sys.stderr, "\t for help use --help" 
     return 2 


if __name__ == "__main__": 
    sys.exit(main()) 

L'erreur survient à la ligne 153 (la ligne qui commence par if send et est juste après cette grande déclaration d'impression de bloc) et il dit

File "secretSanta.py", line 153 
    if send: 
     ^
SyntaxError: invalid syntax 

Mais j'ai des raisons de croire que l'erreur est causée par l'instruction print juste au-dessus parce que quand je commente chaque section ci-dessous l'instruction d'impression l'erreur se déplace à la prochaine ligne de code possible.

Edit: Je reçois un débordement de pile provoquant un piège à abort 6. Il trace à ce bloc de code:

def create_pairs(g, r): 
    givers = g[:] 
    recievers = r[:] 
    pairs = [] 
    for giver in givers: 
     try: 
      reciever = choose_reciever(giver, recievers) 
      recievers.remove(reciever) 
      pairs.append(Pair(giver, reciever)) 
     except: 
      return create_pairs(g, r) 
    return pairs 

spécifiquement la ligne `retour create_pairs (g, r). Je ne sais pas pourquoi le script utilise cette ligne pour être honnête.

+4

Il vous manque une parenthèse à la fin de l'instruction 'print' sur la ligne précédente. La plupart des éditeurs de texte (y compris l'IDLE fourni avec Python) ont une fonction de correspondance de parenthèses qui rendra immédiatement évident. – kindall

+0

Vous auriez dû nous dire quelle ligne est 153 ... – poke

+0

désolé, je suppose que je supposais que les gens le colleraient dans un éditeur de texte, mais vous avez raison j'aurais dû dire spécifiquement ce que c'était pour ceux sur mobile/etc. –

Répondre

1

Le problème se situe dans la ligne avant la ligne 153 (la ligne affichée dans le message d'erreur). Les erreurs de syntaxe sont souvent causées par une autre ligne que celle indiquée dans le message d'erreur. Il vous manque une parenthèse fermante à la ligne 152.

+0

merci! pendant que nous y sommes, je reçois aussi une erreur quand je lance des exceptions. il n'aime pas la virgule entre le type d'exception et le msg/err. –

+0

Utilisez 'Exception ('mon message')'. –

+0

merci! Je pense que c'est presque fixe. Maintenant, je reçois un piège d'abandon: 6 à partir d'un débordement de pile, la trace semble ramener à la ligne 87 que je n'ai pas montré alors peut-être c'est un autre thread? mal l'ajouter à l'édition dans ce post juste pour être en sécurité –