Python: проверить, является ли аргумент целым числом - PullRequest
7 голосов
/ 19 ноября 2010

Я хочу написать скрипт Python, который принимает 3 параметра. Первый параметр - это строка, второй - целое число, а третий - также целое число.

Я хочу поставить условные проверки в начале, чтобы убедиться, что передано правильное количество аргументов, и они имеют правильный тип перед продолжением.

Я знаю, что мы можем использовать sys.argv для получения списка аргументов, но я не знаю, как проверить, что параметр является целым числом, прежде чем присваивать его локальной переменной для использования.

Любая помощь будет принята с благодарностью.

Ответы [ 8 ]

16 голосов
/ 19 ноября 2010

str.isdigit() может использоваться для проверки, состоит ли строка только из чисел.

10 голосов
/ 20 ноября 2010

В целом, вы можете использовать isinstance, чтобы увидеть, является ли что-то экземпляром класса.

Очевидно, что в случае аргументов скрипта все является строкой, но если вы получаете аргументыфункцию / метод и хотите проверить их, вы можете использовать:

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

Вы также можете передать кортеж классов в isinstance:

isinstance(bar, (int, float, decimal.Decimal))
8 голосов
/ 19 ноября 2010

Если вы используете Python 2.7, попробуйте импортировать argparse .Python 3.2 также будет использовать его, и это новый предпочтительный способ разбора аргументов.

Этот пример кода со страницы документации Python принимает список целых чисел и находит максимальное илисумма пропущенных чисел.

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))
6 голосов
/ 19 ноября 2010

Python - попытаться потерпеть неудачу, если ввод не поддерживает такие операции, как

try:
   sys.argv = sys.argv[:1]+map(int,sys.argv[1:])
except:
   print 'Incorrect integers', sys.argv[1:]
4 голосов
/ 19 ноября 2010

Вы можете использовать тип, чтобы определить тип любого объекта в Python. Это работает в Python 2.6, я лично не знаю, присутствует ли он в других версиях.

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."
2 голосов
/ 20 ноября 2010

Я новичок в Python, поэтому я публикую это не только для того, чтобы помочь, но и помочь: получить комментарии о том, почему мой подход / не самый лучший, то есть.

Итак, с заявлением об отказе от ответственности, что я не опытный разработчик Python, вот что я бы сделал:inp, а затем пытается ввести целочисленную форму inp для ввода.Если нет целочисленной формы inp, то inp не является числом, поэтому возникает исключение ValueError.

Я так понимаю, это ваша основная проблема, и вы знаете, как проверить, все ли три параметра указаны правильноформа.Если нет, просто дайте нам знать, и я уверен, что вы получите больше ответов.:)

Только что понял Тони Вейжалайнен отправил аналогичный ответ

1 голос
/ 19 ноября 2010
>>> int('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'foo'

Дайте int. Если он не вызывает ValueError, тогда строка была целым числом.

0 голосов
/ 19 ноября 2010

Вы можете привести аргумент и попробовать ... за исключением ValueError.

Если вы используете sys.argv, также изучите argparse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...