编写代码以支持多个参数,但在仅给出一个参数时会失败。 sys.argv[1] + sys.argv[2]
Code is written to support multiple arguments, but fails when only one argument is given. sys.argv[1] + sys.argv[2]
我当前的代码使用变量 "word",所以 word = sys.argv[1] + sys.argv[2],当我有两个参数时效果很好,但是当我只有一个参数然后我得到 IndexError: list index out of range
我正在编写一个程序,通过从 dictionary .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")
预期结果:
打印单词、词性和定义。
即定义单词(作为单个参数)"Proper"
还要定义 "Self Control"(双字参数)
这是一个很好的切片用例。您需要列表中第一个参数之后的所有内容,因此作为一个切片,这将转换为 [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]
阅读:
- Understanding Python's slice notation
- len() check
- "Ask forgiveness not permission" - explain
- try: except:
我当前的代码使用变量 "word",所以 word = sys.argv[1] + sys.argv[2],当我有两个参数时效果很好,但是当我只有一个参数然后我得到 IndexError: list index out of range
我正在编写一个程序,通过从 dictionary .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")
预期结果: 打印单词、词性和定义。 即定义单词(作为单个参数)"Proper" 还要定义 "Self Control"(双字参数)
这是一个很好的切片用例。您需要列表中第一个参数之后的所有内容,因此作为一个切片,这将转换为 [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]
阅读:
- Understanding Python's slice notation
- len() check
- "Ask forgiveness not permission" - explain
- try: except: