Sam & Max » indentation http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 L’indentation de Python m’a tuer 17 http://sametmax.com/lindentation-de-python-ma-tuer/ http://sametmax.com/lindentation-de-python-ma-tuer/#comments Thu, 09 Aug 2012 13:01:31 +0000 http://sametmax.com/?p=1568 J’adore le fait que Python se base sur des espaces pour délimiter les blocs de code. La seule contrainte que cela a jusqu’ici posé, c’est que les blocs ne peuvent pas être passés en arguments.

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.

]]>
http://sametmax.com/lindentation-de-python-ma-tuer/feed/ 17