Megjelentek a Python nyelvű kódok helytelen vesszőhasználatával kapcsolatos tanulmány eredményei. A problémák forrása, hogy a Python automatikusan egyesíti a listák elemeit, ha azok nincsenek vesszővel elválasztva, továbbá a vessző után helyezett értéket tupleként kezel. 666 GitHub-repozitórium automatikus elemzése után a kutatók 5%-ban azonosítottak lehetséges vesszőproblémákat a vizsgált projektekben.
A további manuális ellenőrzés azt mutatta, hogy valós hibák mindössze 24 repozitóriumban (3,6%) találhatók, míg a maradék 1,4% téves riasztás (például a vessző szándékos kihagyása a fájlok útvonalának, hosszú hashoknak, HTML-blokkoknak vagy SQL-kifejezéseknek a több sorba való összevonása érdekében). Érdekes, hogy a 24 repozitórium között valódi hibákkal olyan nagy projekteket találtak, mint a Tensorflow, a Google V8, a Sentry, a Pydata xarray, a rapidpro, a django-colorfield és a django-helpdesk. Ugyanakkor a vesszőproblémák nem specifikusak a Pythonra, és gyakran előkerülnek C/C++ projekteknél is (például a közelmúltbeli javítások — LLVM, Mono, Tensorflow).
A vizsgált hibák fő típusai:
- Véletlenül kihagyott vesszők listákban, tuple-okban és halmazokban, amelyek miatt az elemek egyesülnek ahelyett, hogy külön értékként értelmeznék őket. Például a Sentry egyik tesztjében hiányzott a vessző a „releases” és a „discover” között a listában, ami a nem létező „/releasesdiscover” kezelő ellenőrzéséhez vezetett ahelyett, hogy külön ellenőrizték volna a „/releases” és a „/discover” elérhetőséget.

Egy másik példa — a rapidpro-ban kihagyott vessző két különböző szabályt egyesített az 572. sorban:

- Hiányzó vessző a tuple egy elemű definiálásának végén, amely miatt a hozzárendelés során nem tuple, hanem sima típus kerül hozzárendelésre. Például a „values = (1,)” kifejezés egy elemű tuple-t rendel a változóhoz, azonban a „values = (1)” egész típusú hozzárendelést eredményez. A zárójelek a megadott hozzárendelésekben nem befolyásolják a típus meghatározását, és elhagyhatóak, a tuple létezését pedig a parser csak a vesszők jelenléte alapján határozza meg. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # A tuple helyett itt egy string kerül hozzárendelésre. ) }
- A fordított helyzet — felesleges vesszők a hozzárendelésnél. Ha a hozzárendelés végén véletlenül marad egy vessző, akkor a szokásos típus helyett egy tuple lesz hozzárendelve (például, ha a «value = 1» helyett a «value = 1,» van megadva).
Forrás: opennet.ru


