Subpy es una biblioteca para definir subconjuntos del lenguaje de Python y consultar ASTS para propiedades a nivel de idioma que se especifican como conjuntos de características.
Muchos proyectos tienen como objetivo trabajar con subconjuntos específicos de Python que sean susceptibles de análisis estático e inferencia de tipo , Subpy es simplemente una biblioteca de análisis estático para verificar los subconjuntos con la intención de proporcionar informes de errores más informativos para los usuarios finales.
La entrada al checker puede ser un módulo, función o código fuente como cadena. Devuelve un diccionario de listas con el código de enumeración feature y los valores con los números de línea donde se detecta la característica.
> >> 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 ]} Haciendo un coincidencia de los códigos de características con las claves en el diccionario, vemos la información que esto nos dice que en el módulo io en la biblioteca estándar:
Un ejemplo utilizando el verificador de nivel de función:
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!' Por ejemplo, si queremos excluir el uso de las comprensiones de la lista y establecer comprensiones, podríamos definir un subconjunto de Python que excluya estas características.
MyPythonSubset = FullPython - { ListComp , SetComp } El comando validator se puede usar para elevar cuando se detectan características no compatibles en la fuente dada. Por ejemplo, admitiremos el conjunto de características de Python, excluyendo las comprensiones de la lista y establecer comprensiones.
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 actualmente puede analizar toda la biblioteca estándar y se puede usar para consultar algunos hechos de trivia interesantes.
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
O para consultar la ejecución de código potencialmente insegura:
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
Las características compatibles actualmente son una enumeración con los valores que se detallan a continuación:
Para probar la ejecución:
$ python -m unittest discover subpy/tests La lógica del núcleo es autónoma en features.py y validate.py que funcionará como módulos independientes sin paquete Subpy, que incluye el conjunto de pruebas. No hay dependencias más que la biblioteca estándar.
Copyright (c) 2013, Continuum Analytics, Inc. Todos los derechos reservados.
Redistribución y uso en formularios de origen y binarios, con o sin modificación, se permiten siempre que se cumplan las siguientes condiciones:
Las redistribuciones del código fuente deben retener el aviso de derechos de autor anterior, esta lista de condiciones y el siguiente descargo de responsabilidad.
Las redistribuciones en forma binaria deben reproducir el aviso de derechos de autor anterior, esta lista de condiciones y el siguiente descargo de responsabilidad en la documentación y/u otros materiales provistos con la distribución. Este software es proporcionado por los titulares de derechos de autor y contribuyentes "tal cual" y cualquier garantía expresa o implícita, incluidas, entre otros, las garantías implícitas de comerciabilidad y idoneidad para un propósito particular se renuncian. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, Incluso si se le aconseja la posibilidad de tal daño.