Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

124
Visualizações
¿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 Respostas
Responde à pergunta

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 números específicos numbers.Number 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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda