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.
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
Vous auriez dû nous dire quelle ligne est 153 ... – poke
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. –