TypeError: debe ser un número real, no STR

Olorunfemi Akinlua 21 junio 2023
TypeError: debe ser un número real, no STR

El error TypeError: must be real number, not str implica utilizar un tipo incorrecto y un número no real, y en este caso, un tipo str.

Trabajar con tipos de datos puede ser complicado, pero es importante hacer cumplir o asegurarse de que está analizando el tipo de datos correcto en una función para evitar ese Error de tipo.

Este artículo explicará cómo ocurre en primer lugar el error TypeError: must be real number, not str y cómo resolverlo usando la conversión de tipo.

Use float() o int() para resolver TypeError: debe ser un número real, no str en Python

Cuando se trabaja con funciones, especialmente funciones integradas, los argumentos requeridos suelen ser de un tipo particular. Podría ser cualquiera de los tipos de datos primitivos, int, float, string o Boolean.

Por lo tanto, es importante asegurarse de que los valores con los que estamos trabajando y analizando sean los datos correctos.

Un ejemplo típico es trabajar con la función incorporada input() para tomar un número y trabajar con el número en una expresión matemática simple.

number = input("Enter a Number: ")
print(number / 34 + 45 * number)

Producción :

Enter a Number: 12
Traceback (most recent call last):
  File "C:\Users\akinl\Documents\Python\steps.py", line 2, in <module>
    print(number/34 + 45 * number)
TypeError: unsupported operand type(s) for /: 'str' and 'int'

Aquí, tenemos un mensaje de TypeError porque el enlace numérico contenía una cadena de datos 12; en lugar de un número entero o flotante, 12.

Sin embargo, este TypeError: tipo(s) de operando no soportado(s) para /: 'str' and 'int' es diferente de este error TypeError: must be real number, not str. La distinción está en la operación que está ocurriendo.

Usemos la biblioteca matemática en Python para redondear hacia abajo el número que ingresa el usuario.

import math

number = input("Enter a Number: ")
print(math.floor(number))

Producción :

Enter a Number: 12.45
Traceback (most recent call last):
  File "C:\Users\akinl\Documents\Python\steps.py", line 3, in <module>
    print(math.floor(number))
TypeError: must be real number, not str

Ahora, el TypeError es diferente porque estamos analizando el enlace number, que contiene una cadena para el método floor(), y el método requiere un número, float o integer.

Por lo tanto, para resolver el problema, necesitamos convertir el tipo de datos del valor que el usuario pasa al enlace number a float o integer, según lo que necesitemos.

La función integrada float() es más apropiada cuando se trata de números de punto flotante. Dado que necesitamos números decimales para redondear, necesitamos la función float().

import math

number = float(input("Enter a Number: "))
print(math.floor(number))

Producción :

Enter a Number: 123.45
123

La función int() puede ser útil para casos en los que el número necesario es un número entero. Si solo necesitamos analizar números enteros con el método sin(), podemos usar el método int().

import math

number = int(input("Enter a Number: "))
print(math.sin(number))

Producción :

Enter a Number: 12
-0.5365729180004349

Puede ser más fácil de resolver para casos más simples pero más complicado para algunos escenarios complejos o más difíciles. Por ejemplo, puede ser difícil ver dónde necesita convertir si está trabajando en una calculadora trigonométrica aleatoria.

Siempre es mejor convertir inmediatamente, especialmente antes de la expresión de la operación. En este caso, la operación matemática.

import random
import math


def create():
    global sideA
    sideA = format(random.uniform(1, 100), ".0f")
    global sideB
    sideB = format(random.uniform(1, 100), ".0f")
    global angleA
    angleA = format(random.uniform(1, 180), ",.3f")
    global angleB
    angleB = ANGLE_B()

    return angleB


def ANGLE_B():
    angle = format(math.asin(sideB * (math.sin(angleA) / sideA)), ".3f")
    return angle


print(create())

Producción :

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\float.py", line 18, in <module>
    print(create())
  File "c:\Users\akinl\Documents\Python\float.py", line 11, in create
    angle_b = ANGLE_B()
  File "c:\Users\akinl\Documents\Python\float.py", line 15, in ANGLE_B
    ang = format(math.asin(side_b*(math.sin(angle_a)/side_a)), '.3f')
TypeError: must be real number, not str

Si rastrea el error, puede ver que comienza desde print(crear ()) que llama a la función ANGLE_B() que usa el enlace sideA, sideB y angleA.

Estos enlaces se analizan en los métodos “matemáticos”, que requieren valores de datos “flotantes” e int. Sin embargo, el tipo de datos del enlace es strings y debe convertirse a float o int.

En este caso, la forma más responsable de resolver el problema del código es convertir el tipo de datos antes de usarlo en una expresión matemática, ya que no necesitamos cambiar el valor nuevamente.

import random
import math


def create():
    global sideA
    sideA = float(format(random.uniform(1, 100), ".0f"))
    global sideB
    sideB = float(format(random.uniform(1, 100), ".0f"))
    global angleA
    angleA = float(format(random.uniform(1, 180), ",.3f"))
    global angleB
    angleB = ANGLE_B()

    return angleB


def ANGLE_B():
    angle = math.asin(sideB * (math.sin(angleA) / sideA))
    return angle


print(create())

Producción :

0.7293575839721542

Por lo tanto, esté a la defensiva cuando trate con tipos de datos y asegúrese de que, después de trabajar con la fecha, convierta los datos al tipo de datos necesario.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Artículo relacionado - Python TypeError

Artículo relacionado - Python Error