Поиск онлайн английские словари


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

Вот мой код:

import webbrowser

class OnlineDictionary:
    """Represents an online dictionary.

    Attributes:
      name: str
      url: str
    """
    def __init__(self, name, url, sep):
        """Initializes an OnlineDictionary object.

        name: str
        url: str
        sep: str
        """
        self.name = name
        self.url = url
        self.sep = sep

    def search(self, query):
        """Searches the dictionary for a given query.

        url: str
        query: str
        """
        query = self.sep.join(query.split())
        webbrowser.open(self.url + query)


def print_instructions(message, instructions, names, num_of_dics):
    """Prints the available dictionaries, their corresponding
    numerals and the instructions.

    message: str
    instructions: str
    names: list
    num_of_dics: int
    """    
    print(message)

    for numeral, name in zip(range(num_of_dics), names):
        print(numeral, name)

    print()
    print(instructions)     


def get_user_data(num_of_dics):
    """Asks the user for which dictionary 
    to use and for what to search for.

    num_of_dics: int

    Returns: tuple
    """
    while True:
        to_use = input('Specify which dictionary or dictionaries to use.\n')
        if to_use == '*':
            break

        try:
            to_use = to_use.replace(' ', '').split(',')
            numerals = []

            for num in to_use:
                num = int(num)
                if num not in range(num_of_dics):
                    raise
                numerals.append(num)

            to_use = set(numerals)  #set is used to get rid of any duplicates
            break

        except:
            continue

    query = input('Type something to search for.\n')

    return (to_use, query)


def __main__():  
    names = ('Merriam-Webster Dictionary', 'Oxford Dictionary', 'Camberidge Dictionary', 'Collins Dictionary',
             'Longman Dictionary of Contemporary English','The American Heritage Dictionary of the English Language')

    urls = ('https://www.merriam-webster.com/dictionary/', 'https://en.oxforddictionaries.com/definition/',
            'https://dictionary.cambridge.org/dictionary/english/', 'https://www.collinsdictionary.com/dictionary/english/',
            'https://www.ldoceonline.com/dictionary/', 'https://ahdictionary.com/word/search.html?q=')

    seps = ('%20', '_', '-', '-', '-', '%20')  #seperators are used if there are spaces in the query 

    collection = list(zip(names, urls, seps))

    num_of_dics = len(names)

    message = "These are the available dictionaries:\n"

    instructions = """To use a dictionary type its corresponding numeral.
To use more than one dictionary seperate the numerals with ",".
To use all of them type "*". Do not type the quotation marks.\n"""

    print_instructions(message, instructions, names, num_of_dics)

    while True:        
        to_use, query = get_user_data(num_of_dics)
        print()
        dics_to_use = collection if to_use == '*' else [collection[num] for num in to_use]
        dics = [OnlineDictionary(name, url, sep) for name, url, sep in dics_to_use]

        for dic in dics:
            print('Searching %s for "%s"...' % (dic.name, query))
            dic.search(query)

        print('Finished searching. Check your Web browser.\n')

if __name__ == '__main__':
    __main__()

Я бы признательны за любые предложения и замечания.



Комментарии
1 ответ

Выглядит довольно хорошо. - Но у меня есть несколько предложений:


  1. Там должен быть способ чтобы выйти (может быть, если вы не вводите ничего, когда он спрашивает, какие словари?)

  2. Вы должны, вероятно, использовать urllib.parse.urljoin вместо +.

  3. Вы должны, вероятно, использовать рекурсию вместо использования while True потом всегда breaking или continueинж.

  4. Вам не нужны скобки при возвращении кортежей.

  5. Голые raise заявления для повторногоподнятия исключений. В противном случае, это дает вам RuntimeError: No active exception to reraise.

  6. Не используйте голыми except.

  7. Я бы, наверное, использовать список кортежей вместо использования zip.

  8. Вы могли бы обойти весь список, а не его длина.

  9. Вы можете использовать enumerate(iterable) вместо zip(range(len(iterable)), iterable). Что enumerate это повторяемое, что на каждой итерации, дает кортежи возрастания номеров, начиная с 0 и следующий элемент из итерируемый (в вашем случае список) вы перечисляете. Подробнее на Питоне документы.

  10. Вы должны справиться с такой логики * в одном месте.

  11. Содержит логику обработки числительных в get_user_data функция.

  12. Вы должны, вероятно, назови свою главную функцию main вместо __main__.

  13. Не сочетать многострочных строк и '\n'.

  14. Это может быть хорошо для вывода результата непосредственно в консоли вместо веб-браузер, но это будет совсем другой проект.

  15. Вы, вероятно, следует вернуться непосредственно вместо использования break.

  16. Возможно, я сделал несколько других незначительных изменений.

Обратите внимание, что некоторые изменения просто личные предпочтения.

Результат (также доступны в https://repl.it/@solly_ucko/DictionarySearchCodeReview):

import webbrowser
from urllib.parse import urljoin

class OnlineDictionary:
"""Represents an online dictionary.

Attributes:
name: str
url: str
"""
def __init__(self, name, url, sep):
"""Initializes an OnlineDictionary object.

name: str
url: str
sep: str
"""
self.name = name
self.url = url
self.sep = sep

def search(self, query):
"""Searches the dictionary for a given query.

url: str
query: str
"""
query = self.sep.join(query.split())
webbrowser.open(urljoin(self.url, query))

def print_instructions(message, instructions, dictionaries):
"""Prints the available dictionaries, their corresponding
numerals and the instructions.

message: str
instructions: str
names: list
num_of_dics: int
"""
print(message)

for numeral, (name, _, _) in enumerate(dictionaries):
print(numeral, name)

print()
print(instructions)

def get_user_data(dictionaries):
"""Asks the user for which dictionary
to use and for what to search for.

num_of_dics: int

Returns: tuple
"""

while True:
to_use = input('Specify which dictionary or dictionaries to use.\n')

if to_use == '':
return (), ''
elif to_use == '*':
to_use = dictionaries
else:
try:
to_use = to_use.replace(' ', '').split(',')
numerals = []

for num in to_use:
num = int(num)

if num not in range(len(dictionaries)):
raise ValueError

numerals.append(num)

to_use = set(map(dictionaries.__getitem__, numerals)) # set is used to get rid of duplicates
query = input('Type something to search for.\n')
return to_use, query
except ValueError:
continue

def main():
dictionaries = [
('Merriam-Webster Dictionary', 'https://www.merriam-webster.com/dictionary/', '%20'),
('Oxford Dictionary', 'https://en.oxforddictionaries.com/definition/', '_'),
('Camberidge Dictionary', 'https://dictionary.cambridge.org/dictionary/english/', '-'),
('Collins Dictionary', 'https://www.collinsdictionary.com/dictionary/english/', '-'),
('Longman Dictionary of Contemporary English', 'https://www.ldoceonline.com/dictionary/', '-'),
('The American Heritage Dictionary of the English Language', 'https://ahdictionary.com/word/search.html?q=', '%20')
]

message = 'These are the available dictionaries:\n'

instructions = """To use a dictionary type its corresponding numeral.
To use more than one dictionary separate the numerals with ",".
To use all of them type "*". Do not type the quotation marks.
"""

print_instructions(message, instructions, dictionaries)

while True:
to_use, query = get_user_data(dictionaries)

if not to_use or not query:
break

print()
chosen_dictionaries = [OnlineDictionary(name, url, sep) for name, url, sep in to_use]

for dictionary in chosen_dictionaries:
print('Searching %s for "%s"...' % (dictionary.name, query))
dictionary.search(query)

print('Finished searching. Check your Web browser.\n')

if __name__ == '__main__':
main()

6
ответ дан 14 марта 2018 в 04:03 Источник Поделиться