Код написан для поддержки нескольких аргументов, но завершается неудачно, если указан только один аргумент. sys.argv[1] + sys.argv[2]
Мой текущий код использует переменную "word", поэтому word = sys.argv[1] + sys.argv[2], которая прекрасно работает, когда у меня есть два аргумента, но когда у меня только один аргумент, я получаю IndexError: list index вне зоны доступа
Я пишу программу, которая определяет слова путем извлечения информации из словаря.com. Я очень внимательно слежу за видеоуроком, потому что я просто пытаюсь научиться работать с базовым словарем (долгосрочная цель - написать приложение для перевода, которое не зависит от google translate api или чего-то подобного). У меня есть код, который работает в том, что он тянет определение, когда вы вводите слово, но не когда вы вводите 2 слова, примеры будут ниже. Поэтому я добавил аргумент, который работал для 2 слов, но больше не работает для одного слова.
import requests
from bs4 import BeautifulSoup as bs
import sys
url = "https://www.dictionary.com/browse/"
word = sys.argv[1] + sys.argv[2]
url+= word
r = requests.get(url)
soup = bs(r.content, "lxml")
try:
pos = soup.findAll("span", {"class" : "luna-pos"})[0].text #luna-pos is an html tag
definitions = soup.findAll("ol")
meanings = definitions[0].findChildren("li", recursive=False)
print(word + ": " + pos)
for (i,meaning) in enumerate(meanings):
print(str(i + 1), meaning.text)
except:
print("Word not found")
Ожидаемые результаты: печать слова, части речи и определения. Т.е. определить слово (являющееся одним аргументом) "надлежащий" и определить "самоконтроль" (аргумент из двух слов)
2 ответа
Это хороший вариант использования для нарезки. Вы хотите все после первого аргумента в списке, так что в качестве фрагмента это переводится в [1:]
, Так что просто используйте:
word = ''.join(sys.argv[1:])
Например:
>>> args = ['scriptname.py', 'the']
>>> ''.join(args[1:])
'the'
>>> args = ['scriptname.py', 'self', 'control']
>>> ''.join(args[1:])
'selfcontrol'
нарезка:
Вы можете использовать нарезку списка, чтобы избежать ошибки:
word = ''.join(sys.argv[1:] # joins 1st to last ..
или же
word = ''.join(sys.argv[1:3] # 1st and 2nd without error
Нарезка списка работает, даже если индекс среза больше, чем количество элементов в списке.
Тестирование:
Другой способ справиться с этим - сначала проверить, а затем добавить:
if len(sys.argv) == 2:
word = sys.argv[1]
elif len(sys.argv) >= 3:
word = sys.argv[1]+sys.argv[2]
else:
word = "" # no input given
Обработка ошибок:
Попробуйте и обработайте ошибку, если она случится
try:
word = sys.argv[1]+sys.argv[2]
except IndexError:
word = sys.argv[1]
Прочитать: