Код написан для поддержки нескольких аргументов, но завершается неудачно, если указан только один аргумент.sys.argv [1] + sys.argv [2] - PullRequest
0 голосов
/ 01 января 2019

Мой текущий код использует переменную "word", поэтому word = sys.argv [1] + sys.argv [2], которая прекрасно работает, когда у меня есть два аргумента, но когда у меня только один аргумент, я получаю IndexError: индекс списка вне диапазона

Я пишу программу, которая определяет слова, извлекая информацию из словаря .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 ]

0 голосов
/ 01 января 2019

Нарезка:

Вы можете использовать нарезку списка, чтобы избежать ошибки:

word = ''.join(sys.argv[1:]  # joins 1st to last ..

или

word = ''.join(sys.argv[1:3]  # 1st and 2nd without error 

Даже нарезка списка работаетесли индекс среза больше, чем количество элементов в списке.


Тестирование:

Другой способ справиться с этим - сначала выполнить тестирование, а затемappend:

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]

Readup:

0 голосов
/ 01 января 2019

Это хороший вариант использования для нарезки.Вы хотите все после первого аргумента в списке, так что в качестве фрагмента это переводится как [1:].Так что просто используйте:

word = ''.join(sys.argv[1:])

Например:

>>> args = ['scriptname.py', 'the']
>>> ''.join(args[1:])
'the'
>>> args = ['scriptname.py', 'self', 'control']
>>> ''.join(args[1:])
'selfcontrol'
...