Aujourd’hui pourtant, ce système si merveilleux nous a bien fait chier pendant une demi-heure.
Cas simple: Max me file un snippet bien racheux dans 0bin. Je clic sur “copy to clipboard”, j’élague la fonction des loggers et des try/catch qui attrapent tout, même un rhûme, et je lance des tests.
File "truc.py", line 35
^
SyntaxError: invalid syntax
Quid ?
Je cherche, je recherche, je creuse, je retourne, je m’enfonce.
Passage en mode fourmis.
Je retire des blocs. Des lignes une a une. Des combinaisons des deux. Des combinaisons arbitraires, aléatoires de blocs transposés dans un autre fichier après conversion en utf-8 et des tabs en espaces.
File "truc.py", line racine de 12
^
SyntaxError: invalid syntax
Je prends Max a témoin.
Nous cherchons. Nous recherchons. Nous creusons. Je m’énerve.
Ce putain de code DOIT marcher. Il n’y a AUCUNE putain d’erreur de syntax là dedans.
Puis eureka, je copie et je colle le texte comme string dans le shell Python.
Lumière:
>>>"""def download(url, dest_path, progress_callback=lambda x, y: 0, proxy=None, block_sz=8192):
...
...
... if proxy is not None:
... # build a new opener that uses a proxy requiring authorization
... proxy_support = urllib2.ProxyHandler({"http" : proxy})
... opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
...
... # install it
... urllib2.install_opener(opener)
...
... u = urllib2.urlopen(url, timeout=30)
... f = open(dest_path, 'w')
...
... meta = u.info()
...
... file_size = int(meta.getheaders("Content-Length")[0])
...
... block_sz = file_size_dl = 8192
... buffer = u.read(block_sz)
... previous_status = ()
...
... while buffer:
...
... file_size_dl += block_sz
... f.write(buffer)
... status = (file_size_dl, file_size_dl * 100. / file_size)
... if status != previous_status:
... """
...
'\ndef download(url, dest_path, progress_callback=lambda x, y: 0, proxy=None, block_sz=8192):\n \n \xc2\xa0\n if proxy is not None:\n # build a new opener that uses a proxy requiring authorization\n proxy_support = urllib2.ProxyHandler({"http" : proxy})\n opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)\n \xc2\xa0\n # install it\n urllib2.install_opener(opener)\n \xc2\xa0\n u = urllib2.urlopen(url, timeout=30)\n f = open(dest_path, \'w\')\n \xc2\xa0\n meta = u.info()\n \n file_size = int(meta.getheaders("Content-Length")[0])\n \xc2\xa0\n block_sz = file_size_dl = 8192\n buffer = u.read(block_sz)\n previous_status = ()\n \xc2\xa0\n while buffer:\n \xc2\xa0\n file_size_dl += block_sz\n f.write(buffer)\n status = (file_size_dl, file_size_dl * 100. / file_size)\n if status != previous_status:\n previous_status = status\n progress_callback(*status)\n \n buffer = u.read(block_sz)\n \xc2\xa0\n \xc2\xa0\n f.close()\n \xc2\xa0\n '
Mais quel est ce petit salopard de “\xc2\xa0” ?
In [2]: print "a\xc2\xa0b"
a b
Caractère utf8 pour “espace insécable”.
Pour Sublime Text et 0bin, se sont des espaces comme les autres. Pour Python, c’est une syntax error.
Fuck.
La coloration syntaxique de 0bin doit sans doute insérer ce truc à chaque saut de ligne. Du coup on a patché tout ça, les sources sont à jour sur github et j’en ai profité pour updater le paquet sur pypi qui est maintenant la dernière en date avec tous les goodies: détection de code source, send by mail, compteur, etc.
]]>