Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

241
Vistas
¿Cómo insinuar el número * tipos * (es decir, subclases de Número), no los números en sí mismos?

Suponiendo que quiero escribir una función que acepte cualquier tipo de número en Python, puedo anotarla de la siguiente manera:

 from numbers import Number def foo(bar: Number): print(bar)

Llevando este concepto un paso más allá, estoy escribiendo funciones que aceptan tipos de números, es decir, int , float o numpy dtypes, como argumentos. Actualmente, estoy escribiendo:

 from typing import Type def foo(bar: Type): assert issubclass(bar, Number) print(bar)

Pensé que podría sustituir Type con algo como NumberType (similar a NotImplementedType y amigos, reintroducidos en Python 3.10 ), porque todos los tipos de números son subclases de Number :

 from numbers import Number import numpy as np assert issubclass(int, Number) assert issubclass(np.uint8, Number)

Resulta que (o al menos por lo que puedo decir), no existe un NumberType genérico en Python (3.9):

 >>> type(Number) abc.ABCMeta

¿Existe una forma limpia (es decir, sin controles de tiempo de ejecución) para lograr el tipo de anotación deseado?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No hay una forma general de hacer esto. Para empezar, los números no están estrictamente relacionados y sus tipos son aún menos.


Mientras que numbers.Number puede parecer "el tipo de números", no es universal. Por ejemplo, decimal.Decimal no es explícitamente un numbers.Number como subclase, subtipo o subclase virtual. Específicamente para escribir, numbers.Number El número no está respaldado por PEP 484 - Sugerencias de tipo .

Para escribir indirectamente "números" de manera significativa, uno tiene que definir explícitamente qué números son en ese contexto. Esto podría ser un conjunto de tipos numéricos preexistente como int <: float <: complex , un typing.Union / TypeVar de tipos numéricos, un typing.Protocol para definir operaciones y estructura algebraica, o similar.

 from typing import TypeVar from decimal import Decimal from fractions import Fraction #: typevar of rational numbers if we squint real hard Q = TypeVar("Q", float, Decimal, Fraction)

Dicho todo esto, "el tipo del tipo de números" es aún menos significativo. Incluso los numbers.Number específicos . El número prácticamente no tiene ninguna característica: no se puede convertir a un tipo concreto, ni se puede instanciar en un número significativo.

En su lugar, utilice "el tipo de algún tipo de números":

 from typing import Type def zero(t: Type[Q]) -> Q: return t() # all Type[Q]s can be instantiated without arguments print(zero(Fraction))

Si el único objetivo del Type es crear instancias, puede ser mejor solicitar un Callable en su lugar. Esto cubre tanto los tipos como las funciones de fábrica.

 def one(t: Callable[[int], Q]) -> Q: return t(1)
over 4 years ago · Santiago Trujillo Denunciar

0

Esta no es una respuesta a la pregunta original. ( La respuesta de Alex Waygood se seleccionó correctamente como receptiva). Sin embargo, he intentado generalizar mis propias soluciones alternativas para los bordes afilados entre los números y la escritura en Python. Esas soluciones ahora viven en numerary (después de haberlo extraído por cesárea de dyce , donde fue concebido).

No dediqué mucho tiempo a nombrar, con la esperanza de que dure poco. Los documentos están en línea. Debe considerarse experimental, pero se está acercando rápidamente a la estabilidad. Se agradecen desesperadamente los comentarios, las sugerencias y las contribuciones .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda