SubPy est une bibliothèque pour définir des sous-ensembles de la langue Python et interroger les AST pour les propriétés au niveau de la langue qui sont spécifiées comme des ensembles de fonctionnalités.
De nombreux projets visent à travailler avec des sous-ensembles spécifiques de Python qui se prêtent à une analyse statique et à l'inférence de type , Subpy est simplement une bibliothèque d'analyse statique pour vérifier les sous-ensembles dans le but de fournir des rapports d'erreur plus informatifs pour les utilisateurs finaux.
L'entrée dans le checker peut être un module, une fonction ou un code source sous forme de chaîne. Il renvoie un dictionnaire de listes clé par le code d'énumération feature et les valeurs avec les numéros de ligne où la fonction est détectée.
> >> from subpy import checker
> >> import io
> >> print checker ( io )
{ 3 : [ 98 ],
5 : [ 78 , 81 , 84 , 87 ],
9 : [ 78 , 81 , 84 , 87 ],
10 : [ 81 , 84 , 87 ],
32 : [ 92 , 96 ],
34 : [ 79 ]} Correspondant aux codes de fonctionnalité avec les clés du dictionnaire, nous voyons les informations que cela nous dit dans le module io dans la bibliothèque standard:
Un exemple utilisant le vérificateur de niveau de fonction:
from subpy import checker
from subpy . features import ListComp
def example1 ():
return [ x ** 2 for x in range ( 25 )]
def example2 ():
return 'hello'
features = checker ( example1 )
if ListComp in features :
print 'You used a list comprehension on lines %r' % ( features [ ListComp ])
features = checker ( example2 )
if ListComp not in features :
print 'You did not use any list comprehensions!' Par exemple, si nous voulons exclure l'utilisation des compréhensions de la liste et définir les compréhensions, nous pourrions définir un sous-ensemble de Python qui exclut ces fonctionnalités.
MyPythonSubset = FullPython - { ListComp , SetComp } La commande validator peut être utilisée pour augmenter lorsque des fonctionnalités non pris en charge sont détectées dans la source donnée. Par exemple, nous prendrons en charge l'ensemble de fonctionnalités Python hors des compréhensions de la liste et des compréhensions de la liste.
from subpy import validator , FullPython , FeatureNotSupported
from subpy . features import ListComp , SetComp
def example ():
return [ x ** 2 for x in range ( 25 )]
my_features = FullPython - { ListComp , SetComp }
validator ( example , features = my_features ) File "<stdin>" , line 2
return [ x ** 2 for x in range ( 25 )]
^
subpy . validate . FeatureNotSupported : ListCompSubPy est actuellement en mesure d'analyser toute la bibliothèque standard et peut être utilisée pour interroger certains faits de trivia intéressants.
from subpy import detect
from subpy . stdlib import libraries
from subpy . features import Metaclasses , MInheritance , Exec
import importlib
print ( 'Libraries with Multiple Inheritance and Metaclasses:' )
for lib in libraries :
mod = importlib . import_module ( lib )
features = detect ( mod )
if Metaclasses in features and MInheritance in features :
print ( lib ) Libraries with Multiple Inheritance and Metaclasses:
io
Ou pour interroger pour une exécution de code potentiellement dangereuse:
print ( 'Libraries with Exec' )
for lib in libraries :
mod = importlib . import_module ( lib )
features = detect ( mod )
if Exec in features :
print ( lib ) Libraries with Exec
ihooks
site
cgi
rexec
Bastion
imputil
trace
timeit
cProfile
doctest
code
bdb
runpy
profile
collections
Les fonctionnalités actuellement prises en charge sont une énumération avec des valeurs ci-dessous:
Pour tester l'exécution:
$ python -m unittest discover subpy/tests La logique principale est autonome dans features.py et validate.py qui fonctionnera en tant que modules autonomes sans package SubPy, qui comprend la suite de tests. Il n'y a pas de dépendances autres que la bibliothèque standard.
Copyright (C) 2013, Continuum Analytics, Inc. Tous droits réservés.
La redistribution et l'utilisation dans les formulaires source et binaire, avec ou sans modification, sont autorisées à condition que les conditions suivantes soient remplies:
Les redistributions du code source doivent conserver l'avis de droit d'auteur ci-dessus, cette liste de conditions et l'avertissement suivant.
Les redistributions sous forme binaire doivent reproduire l'avis de droit d'auteur ci-dessus, cette liste de conditions et la clause de non-responsabilité suivante dans la documentation et / ou d'autres documents fournis avec la distribution. Ce logiciel est fourni par les détenteurs de droits d'auteur et les contributeurs "tels quels" et toutes les garanties expresses ou implicites, y compris, mais sans s'y limiter, les garanties implicites de qualité marchande et d'adéquation à un usage particulier sont déclinées. En aucun cas, le titulaire ou les contributeurs du droit d'auteur ne sera pas responsable de tout dommage directement, indirect, accessoire, spécial, exemplaire ou consécutif (y compris, mais sans interruption commerciale) Si vous êtes conseillé de la possibilité de tels dégâts.