Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

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

Suponiendo que quiero escribir una función que acepte cualquier tipo de número en Python, puedo anotarlo 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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!