with tutorial script scraping scrap con code python types type-safety dynamic-typing memory-safety

tutorial - ¿Es seguro el tipo Python?



using beautifulsoup python (4)

Como nadie lo ha dicho aún, también vale la pena señalar que Python está fuertemente tipado , lo que no debe confundirse con el tipeado dinámicamente. Python difiere la verificación de tipos hasta el último momento posible, y generalmente da lugar a que se lance una excepción. Esto explica el comportamiento que menciona Mureinik. Dicho esto, Python también hace conversiones automáticas a menudo. Lo que significa que intentará convertir un int en un flotador para una operación aritmética, por ejemplo.

Puede aplicar la seguridad de tipos en sus programas manualmente al verificar los tipos de entradas. Debido a que todo es un objeto, siempre puede crear clases que se derivan de clases base y usar la función de isistance para verificar el tipo (en tiempo de ejecución, por supuesto). Python 3 ha agregado sugerencias de tipo, pero esto no se aplica. Y mypy ha agregado la verificación de tipos estática al idioma si le importa usarlo, pero esto no garantiza la seguridad de los tipos.

Segun Wikipedia

Los científicos informáticos consideran que un lenguaje es "de tipo seguro" si no permite operaciones o conversiones que violen las reglas del sistema de tipos.

Dado que las verificaciones de tiempo de ejecución de Python aseguran que se cumplan las reglas de tipo de sistema, debemos considerar a Python como un lenguaje seguro de tipo.

El mismo punto lo señalan Jason Orendorff y Jim Blandy en Programming Rust :

Tenga en cuenta que la seguridad de tipos es independiente de si un idioma comprueba los tipos en el momento de la compilación o en el tiempo de ejecución: C comprueba en el momento de la compilación, y no es seguro para el tipo; Python comprueba en tiempo de ejecución y es de tipo seguro.

Tanto la noción separada de verificación de tipo estático como la seguridad de tipo.

¿Es eso correcto?


El artículo de wikipedia asocia la seguridad de tipos a la memoria segura, lo que significa que no se puede acceder a la misma área de memoria como, por ejemplo, entero y cadena. De esta manera Python es de tipo seguro. No puede cambiar el tipo de un objeto implícitamente.


En Python, obtendrá un error de tiempo de ejecución si utiliza una variable del tipo incorrecto en el contexto incorrecto. P.ej:

>>> ''a'' + 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate ''str'' and ''int'' objects

Dado que esta comprobación solo se realiza en tiempo de ejecución , y no antes de ejecutar el programa, Python no es un lenguaje seguro para el tipo ( PEP-484 pesar de PEP-484 ).


Muchos programadores igualarán la comprobación de tipo estático a la seguridad de tipo:

  • "El lenguaje A tiene verificación de tipo estático y por lo tanto es seguro"
  • "El lenguaje B tiene una comprobación dinámica de tipos y, por lo tanto, no es seguro para tipos"

Lamentablemente, no es tan simple.

En el mundo real

Por ejemplo, C y C ++ no son seguros para el tipo porque puede socavar el sistema de tipos a través del punteo de tipos . Además, las especificaciones del lenguaje C / C ++ permiten ampliamente el comportamiento indefinido (UB) en lugar de manejar explícitamente los errores y esto se ha convertido en la fuente de ataques de seguridad como el exploit de aplastamiento de pila y el ataque de cadenas de formato . Tales proezas no deberían ser posibles en lenguajes de tipo seguro. Las primeras versiones de Java tenían un error de tipo con sus Generics que demostraban que no era completamente seguro.

Aún hoy, para lenguajes de programación como Python, Java, C ++, ... es difícil demostrar que estos lenguajes son completamente seguros porque requieren una prueba matemática. Estos lenguajes son masivos y los compiladores / intérpretes tienen errores que continuamente se reported y se arreglan.

[ Wikipedia ] Muchos idiomas, por otro lado, son demasiado grandes para las pruebas de seguridad de tipo generado por el hombre, ya que a menudo requieren la verificación de miles de casos. .... ciertos errores pueden ocurrir en tiempo de ejecución debido a errores en la implementación, o en bibliotecas vinculadas escritas en otros idiomas; tales errores podrían hacer que un tipo de implementación dado sea inseguro en ciertas circunstancias.

En la academia

La seguridad de tipos y los sistemas de tipo, mientras que son aplicables a la programación en el mundo real, tienen sus raíces y definiciones provenientes de la academia , por lo que una definición formal de lo que es exactamente "seguridad de tipo" viene con dificultad, especialmente cuando se habla de lenguajes de programación reales utilizados en la realidad mundo. A los académicos les gusta matemáticamente (formalmente) definir pequeños lenguajes de programación llamados lenguajes de juguete . Solo para estos idiomas es posible mostrar formalmente que son seguros para el tipo (y probar que las operaciones son lógicamente correct ).

[ Wikipedia ] La seguridad de tipos suele ser un requisito para cualquier lenguaje de juguete propuesto en la investigación del lenguaje de programación académica

Por ejemplo, los académicos tuvieron dificultades para probar que Java es de tipo seguro, por lo que crearon una versión más pequeña llamada Featherweight Java y demostraron en un paper que es de tipo seguro. Del mismo modo, este Ph.D. El papel de Christopher Lyon Anderson tomó un subconjunto de Javascript, lo llamó JS0 y demostró que era de tipo seguro.

Prácticamente se asume que los lenguajes adecuados como python, java, c ++ no son completamente seguros para el tipo porque son muy grandes. Es tan fácil que un pequeño insecto se escape a través de las grietas que socavarían el sistema de tipos.

Resumen

  • Es probable que ningún pitón no sea completamente seguro para el tipo: nadie lo ha demostrado, es demasiado difícil de demostrar. Es más probable que encuentre un pequeño error en el lenguaje que demuestre que no es seguro para el tipo.
  • De hecho, es probable que la mayoría de los lenguajes de programación no sean completamente seguros para el tipo , todo por las mismas razones (solo los académicos de juguete han demostrado ser)
  • Realmente no deberías creer que los lenguajes de tipo estático son necesariamente seguros . Por lo general, son más seguros que los lenguajes de tipo dinámico, pero decir que son completamente seguros de tipos con certeza es incorrecto ya que no hay pruebas de ello.

Referencias: http://www.pl-enthusiast.net/2014/08/05/type-safety/ y https://en.wikipedia.org/wiki/Type_system