2010-11-19 21 views
5

Quiero escribir un script de python que tome 3 parámetros. El primer parámetro es una cadena, el segundo es un número entero, y el tercero es también un número entero.Python: prueba si un argumento es un número entero

Quiero realizar comprobaciones condicionales al inicio para asegurarme de que se proporciona el número adecuado de argumentos, y son el tipo correcto antes de continuar.

Sé que podemos usar sys.argv para obtener la lista de argumentos, pero no sé cómo probar que un parámetro es un número entero antes de asignarlo a mi variable local para su uso.

Cualquier ayuda sería muy apreciada.

+1

¿Qué versión de Python que se ejecuta? – Zeke

Respuesta

8

Si está ejecutando Python 2.7, intente importar argparse. Python 3.2 también lo usará, y es la nueva forma preferida de analizar argumentos.

Este código de ejemplo de Python documentation page toma una lista de entradas y encuentra la cantidad máxima o la suma de los números pasados.

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 
1
>>> int('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'foo' 

dárselo a int. Si no sube un ValueError, la cadena era un número entero.

6

manera Python es intentar y fallar si la entrada no admite la operación como

try: 
    sys.argv = sys.argv[:1]+map(int,sys.argv[1:]) 
except: 
    print 'Incorrect integers', sys.argv[1:] 
+1

+1 También conocido como EAFP: http://docs.python.org/glossary.html#term-eafp –

+0

Utilicé esta construcción ('excepto TypeError') pero no capté como' TypeError' para el valor ' 1x'. Obtuve 'ValueError: literal inválido para int() con base 10: '1x''. Por lo tanto, editaré respetuosamente la respuesta para hacer que el 'excepto 'sea genérico. – amphibient

+0

Excepto por el paréntesis 'print' que debe incluirse para Python 3.4+, ¿se puede usar el bloque' try' anterior como está para python 3.4+ ??? ---- Recibo un error que dice que no puedo concatenar 'map' a la lista. Como resultado, la prueba siempre salta a la cláusula de excepción. Cheers, – Cbhihe

0

Puede emitir el argumento y tratar ... excepto el ValueError.

Si está utilizando sys.argv, también investigue argparse.

13

str.isdigit() se puede utilizar para comprobar si una cadena está compuesta únicamente por números.

3

Puede usar el tipo para determinar el tipo de cualquier objeto en Python. Esto funciona en Python 2.6, no sé personalmente si está presente en otras versiones.

obvious_string = "This is a string." 
if type(obvious_string) != int: 
    print "Bro, that is so _not_ an integer." 
else: 
    print "Thanks for the integer, brotato chip." 
+3

El problema con esto es que todos los argumentos que pasan a través de sys.argv son por definición cadenas; lo que el poster necesita saber es '¿puedo convertir este argumento en un int o no?' Si no se usa argparse, la mejor forma (como se indica en otra parte) para intentar la conversión dentro de un bloque try/except. – bgporter

+0

Cuanto más sepa ... – Zack

9

De manera más general, se puede utilizar isinstance para ver si algo es una instancia de una clase.

Obviamente, en el caso de argumentos del script, todo es una cadena, pero si usted está recibiendo argumentos a una función/método y desea comprobar ellos, se puede utilizar:

def foo(bar): 
    if not isinstance(bar, int): 
     bar = int(bar) 
    # continue processing... 

También se puede pasar una tupla de clases a isinstance:

isinstance(bar, (int, float, decimal.Decimal)) 
+0

no aplicable a este caso, todos los argumentos de la línea cmd se reciben como cadenas. pero no sabía que uno puede pasar tupples a isinstance, así que gracias, lo aprendí. –

2

soy nuevo en Python, así que estoy fijando esto no sólo para ayudar, sino también ser ayudado: obtener comentarios sobre por qué mi enfoque es/no es el la mejor, que es.

tanto, con la advertencia de que no soy un dev pitón con experiencia, esto es lo que yo haría:

inp = sys.argv[x] 
try: 
    input = int(inp) 
except ValueError: 
    print("Input is not an integer") 

Lo que el anterior es que pone sys.argv [x] a INP y luego intenta poner la forma entera de inp a la entrada. Si no hay una forma entera de inp, inp no es un número, por lo que se genera una excepción ValueError.

Supongo que ese es su problema principal y usted sabe cómo comprobar si tiene los tres parámetros en la forma correcta. Si no, solo háganos saber y estoy seguro de que obtendrá más respuestas. :)

acabo de dar cuenta Tony Veijalainen registró una similar answer

Cuestiones relacionadas