Python: запустить оператор, который не имеет никакого эффекта, просто чтобы проверить, генерируется ли исключение? - PullRequest
0 голосов
/ 25 мая 2018

Я хочу, чтобы что-то произошло, если пользовательский ввод недопустим (посмотрите на блок исключений):

try:
    name = raw_input("\nEnter someone's name (x to exit): ")
    table_dictionary[name.title()]  # This is what I am talking about
    fact = raw_input("What do you want to know about " + name.title() + "?: ")
    print name.title() + "'s " + fact + " is " + str(table_dictionary[name.title()][fact.title()])
except KeyError:
    if name == "x":
        print 'Closing'
        break
    print "Error: Invalid input"

Обратите внимание, как я запускаю table_dictionary[name.title()], даже если он ничего не делает.Я делаю это в случае, если пользовательский ввод отсутствует в словаре, он сообщит пользователю, что это неверный ввод.PyCharm выделяет это и говорит мне, что statement seems to have no effect.Мне просто интересно, если это хорошая практика или нет.

Редактировать: Обратите внимание, что я также хочу напечатать «Ошибка: неверный ввод», если пользователь также вводит неверные данные для факта.Мой пример покрывает это.

Ответы [ 5 ]

0 голосов
/ 26 июня 2019

Вы можете сделать

_ = table_dictionary[name.title()]  # This is what I am talking about

, потому что в Python принято использовать символ подчеркивания _ для обозначения того, что эта переменная не используется.В противном случае Pycharm будет жаловаться на неиспользованную переменную.

0 голосов
/ 25 мая 2018

Я бы предложил сделать что-то подобное.Ничто не бесполезно сейчас.

try:
    name = raw_input("\nEnter someone's name (x to exit): ")
    assert name != 'x', "Closing"
    assert table_dictionary.has_key(name.title()), "Error: Invalid input '%s'" % name
    fact = raw_input("What do you want to know about " + name.title() + "?: ")
    assert table_dictionary[name.title()].has_key(fact.title()), "Error: Invalid input '%s'" % fact
    print name.title() + "'s " + fact + " is " + str(table_dictionary[name.title()][fact.title()])
except AssertionError as err:
    print err
0 голосов
/ 25 мая 2018

Может быть нормально запустить некоторый код, просто чтобы увидеть, вызывает ли он исключение, но часто есть лучший способ проверить, возможно ли что-то или нет.В вашем конкретном случае я бы предложил проверить, находится ли ключ в словаре, используя оператор in с if, elif и else для устранения последствий:

name = raw_input("\nEnter someone's name (x to exit): ")
if name.title() in table_dictionary:
    fact = raw_input("What do you want to know about " + name.title() + "?: ")
    print name.title() + "'s " + fact + " is " + str(table_dictionary[name.title()][fact.title()])
elif name == "x":
    print 'Closing'
    break
else:
    print "Error: Invalid input"
0 голосов
/ 25 мая 2018

Я думаю, что это более элегантно и питонно:

name = raw_input("\nEnter someone's name (x to exit): ")
if name == "x":
    print 'Closing'
    break
try:
    fact_dictionary = table_dictionary[name.title()]
    fact = raw_input("What do you want to know about " + name.title() + "?: ")
    print name.title() + "'s " + fact + " is " + str(fact_dictionary[fact.title()])
except KeyError:
    print "Error: Invalid input"

Таким образом, мы перехватываем оба возможных исключения для неверного ввода и прерываемся рано, если name == 'x'

Это также делает ваш кодболее читабелен и не позволяет PyCharm жаловаться.

Я не согласен с некоторыми другими комментаторами, которые предлагают проверять ключи в словарях и т. д., вы вправе использовать исключения для управления потоком, EAFP - это путь Питона.

0 голосов
/ 25 мая 2018

Проверка ключа в table_dictionary может быть лучше

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