Sono stati pubblicati i risultati di uno studio sulla suscettibilità del codice Python agli errori legati all'uso scorretto delle virgole. I problemi derivano dal fatto che, nelle enumerazioni, Python unisce automaticamente le stringhe in un elenco se non sono separate da una virgola e gestisce il valore come una tupla se dopo esso è presente una virgola. Dopo un'analisi automatizzata di 666 repository GitHub contenenti codice Python, i ricercatori hanno identificato possibili problemi con le virgole nel 5% dei progetti studiati.
Un ulteriore controllo manuale ha rivelato che gli errori reali sono presenti solo in 24 repository (3,6%), mentre l'1,4% rimanente è costituito da falsi positivi (ad esempio, una virgola potrebbe essere stata intenzionalmente omessa tra le righe per unire percorsi di file spezzati su più righe, hash lunghi, blocchi HTML o espressioni SQL). È notevole che tra i 24 repository con errori reali ci siano grandi progetti come Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield e django-helpdesk. Inoltre, i problemi con le virgole non sono specifici di Python e spesso si riscontrano in progetti C/C++ (sono recenti le correzioni in LLVM, Mono, Tensorflow).
Tipi principali di errori analizzati:
- Virgola accidentalmente omessa in elenchi, tuple e set, che porta all'unione di righe invece di essere interpretate come valori separati. Ad esempio, in Sentry, in uno dei test, è stata omessa una virgola tra le righe "releases" e "discover" nell'elenco, il che ha portato al controllo di un handler inesistente "/releasesdiscover", anziché controllare separatamente "/releases" e "/discover".

Un altro esempio è la virgola mancante in rapidpro, che ha portato all'unione di due regole diverse nella riga 572:

- Una virgola mancante alla fine della definizione di una tupla a un elemento porta alla situazione in cui, durante l'assegnazione, viene assegnato un tipo normale invece di una tupla. Ad esempio, l'espressione «values = (1,)» porterà all'assegnazione alla variabile di una tupla a un elemento, mentre «values = (1)» combinerà un tipo intero. Le parentesi nelle assegnazioni indicate non influenzano la definizione del tipo e sono facoltative, mentre la presenza della tupla è determinata dal parser esclusivamente sulla base della presenza di virgole. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # anziché una tupla verrà assegnata una stringa. ) }
- Situazione opposta: virgole extra durante l'assegnazione. Se alla fine dell'assegnazione viene accidentalmente lasciata una virgola, allora come valore verrà assegnata una tupla invece di un tipo normale (ad esempio, se invece di «value = 1» viene indicato «value = 1,»).
Fonte: opennet.ru


