Код написан для поддержки нескольких аргументов, но завершается неудачно, если указан только один аргумент. 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]

Прочитать:

Другие вопросы по тегам