Este es un problema de tarea. He estado tratando de resolverlo, pero no pude obtener el resultado correcto.

Esta es la pregunta:

Escriba una función string2int que intente convertir una cadena en un entero. Si la cadena representa un entero positivo, entonces ese entero debería ser devuelto. Si la cadena no representa un número entero positivo, debe generar una excepción de sintaxis (raise SyntaxError('not an integer')).

Puede elegir usar la función (ya definida) all_digits que toma una cadena y devuelve True si todos los caracteres de la cadena son dígitos y False de lo contrario.

Lo que tengo hasta ahora es:

try all_digits is True:
    return int(num)
except all_digits is False:
    raise SyntaxError('not an integer')

Como estoy usando una función ya definida, no definí una función (¿o me equivoqué?). ¿Alguien puede echar un vistazo a mi código por favor? Muy apreciado.

0
Nil 1 sep. 2014 a las 10:24

3 respuestas

La mejor respuesta

Puedo adivinar, pero es posible que desee decirnos qué tipo de error obtiene cuando ejecuta el código (solo un aviso para la próxima vez que haga una pregunta).

Hay un par de errores:

1) La sintaxis de

try all_digits is True:

Está Mal. La declaración "try" debería verse así:

try:
    <your code>
except <type of exception to catch>:
    <error handling code>

2) Dijiste "all_digits" es una función. Por lo tanto, el código

all_digits is True

Debe ser

if all_digits(num):

Poniendolo todo junto:

def string2int(num):
    if all_digits(num):
        return int(num)
    raise SyntaxError('not an integer')
3
Aran-Fey 1 sep. 2014 a las 06:31

Función all_digits(string):

Primero, es bueno entender qué hace la función predefinida all_digits(string). A continuación se muestra una implementación de muestra de esa función, que funciona según lo deseado por su descripción. Comprueba si cada letra de la cadena es un dígito y devuelve un booleano, True o False, en consecuencia:

def all_digits(string):
''' only returns True if all characters of the string are Integers '''
    for l in string:
        if l.isdigit(): pass
        else: return False
    return True

Función string2num(string) con declaración raise:

Ahora, podemos usar esta función en nuestro bloque de manejo de errores de la función string2num(string). Dado que su problema requiere que solo raise una excepción específica y no continúe con un bloque de código alternativo, no necesita el bloque try: ... except:.

Con la sintaxis adecuada de la raise declaración, podemos escribir:

def string2num( string = '-23'):
    if all_digits(string):
        return int('23')
    raise SyntaxError("not an integer")

Y obtenemos:

>>> string2num()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 4, in string2num
SyntaxError: not an integer

con el bloque try: ... except: ...:

Pero si desea ejecutar un bloque de código alternativo cuando se genera la excepción, puede usar la sintaxis de bloque try: ... except:. Es posible que lo necesite, por ejemplo, si desea verificar si la cadena es un entero negativo y, de ser así, devolver el entero negativo:

def string2num( string = '-23'):
    try:
        if all_digits(string):
            return int(string)
        raise SyntaxError("not an integer")
    except SyntaxError:
        #alternate code goes here#
        try:
            return int(string)
        except ValueError:
            print "string contains an alphabet"

Esto producirá:

>>> string2num()
-23
>>> string2num('ab2')
string contains an alphabet

Estilo para la declaración if:

Como nota al margen sobre su estilo, no tiene que escribir explícitamente si una expresión se evalúa como True o False en una declaración if, así:

if all_digits(string) is True:

Dado que all_digits(string) devuelve un valor booleano, puede decir simplemente if True, así:

if all_digits(string):
0
Pacific Stickler 1 sep. 2014 a las 08:23

Además de la excelente respuesta de Rawing, tenga en cuenta que el momento habitual para usar try/except es cuando puede manejar el error arrojado en el bloque try y continuar como de costumbre. Por ejemplo:

def add_three(x) -> int:
    try:
        return x + 3
    except TypeError:
        # someone passed a non-int/float to the function!
        #   let's try and coerce it.
        return int(x) + 3
        # if this still throws an exception, we'll let it
        #   raise its own TypeError exception!

En su caso, parece que solo está haciendo condicionales regulares, así que use if all_digits(num): return int(num) else: raise TypeError('not an integer')

0
Adam Smith 1 sep. 2014 a las 06:59