Инструмент личного архива, ищите предложения по улучшению кода - PullRequest
0 голосов
/ 26 июля 2010

Я написал инструмент на Python, в котором вы вводите заголовок, содержимое, затем теги, и запись затем сохраняется в файле рассола. в основном он был разработан для функции копирования-вставки (вы обнаруживаете фрагмент кода, который вам нравится в сети, копируете и вставляете его в программу), а не для рукописного содержимого, хотя он делает это без проблем.

В основном я делал это, потому что я всегда сканирую свои pdf-файлы, книги или сеть, чтобы найти какой-то пример кодирования решения, которое я уже видел раньше, и было просто логично иметь что-то, куда вы могли бы просто положить содержание, дайте ему название и теги, и просто ищите его, когда вам нужно.

Я понимаю, что в Интернете есть сайты, которые занимаются этим бывшим. http://snippets.dzone.com, но я не всегда в сети, когда кодирую. Я также признаю, что на самом деле я не смотрел, написал ли кто-нибудь приложение для настольного компьютера, этот проект показался мне забавным, вот и я.

он не был разработан с учетом миллионов записей, поэтому я просто использую файл рассылки для сериализации данных вместо одного из API-интерфейсов базы данных. запрос также очень простой, только заголовок и теги, и нет рейтинга на основе запроса.

есть проблема, которую я не могу выяснить, когда вы находитесь в списке записей, есть попытка, кроме пункта, где он пытается поймать действительный индекс (целое число). если вы введете целое число inavlid, оно попросит вас ввести действительное, но, похоже, оно не сможет присвоить его переменной. если вы введете правильное целое число сразу, проблем не возникнет, и запись отобразится.

В любом случае, дайте мне знать, что вы, ребята, думаете. это кодируется для python3.

основной файл:

#!usr/bin/python

from archive_functions import Entry, choices, print_choice, entry_query 
import os

def main():
    choice = ''
    while choice != "5":
        os.system('clear')
        print("Mo's Archive, please select an option")
        print('====================')
        print('1. Enter an entry')
        print('2. Lookup an entry')
        print('3. Display all entries')
        print('4. Delete an entry')
        print('5. Quit')
        print('====================')
        choice = input(':')

        if choice == "1":
            entry = Entry()
            entry.get_data()
            entry.save_data()

        elif choice == "2":
            queryset = input('Enter title or tag query: ') 
            result = entry_query('entry.pickle', queryset)
            if result:
                print_choice(result, choices(result))
            else:
                os.system('clear')
                print('No Match! Please try another query')
                pause = input('\npress [Enter] to continue...')

        elif choice == "3":
            queryset = 'all'    
            result = entry_query('entry.pickle', queryset)
            if result:
                print_choice(result, choices(result))

        elif choice == "4":
            queryset = input('Enter title or tag query: ')
            result = entry_query('entry.pickle', queryset)
            if result:
                entry = result[choices(result)]
                entry.del_data()
            else:
                os.system('clear')
                print('No Match! Please try another query')
                pause = input('\npress [Enter] to continue...')

        elif choice == "5":
            break

        else:
            input('please enter a valid choice...')
            main()

if __name__ == "__main__":
    main()

archive_functions.py:

#!/bin/usr/python
import sys
import pickle
import os
import re

class Entry():
    def get_data(self):
        self.title = input('enter a title: ')
        print('enter the code, press ctrl-d to end: ')
        self.code = sys.stdin.readlines()
        self.tags = input('enter tags: ')

    def save_data(self):
        with open('entry.pickle', 'ab') as f:
            pickle.dump(self, f)

    def del_data(self):
        with open('entry.pickle', 'rb') as f:
            data_list = []
            while True:
                try:
                    entry = pickle.load(f)
                    if self.title == entry.title:
                        continue
                    data_list.append(entry)
                except:
                    break
        with open('entry.pickle', 'wb') as f:
            pass
        with open('entry.pickle', 'ab') as f:
            for data in data_list:
                data.save_data()

def entry_query(file, queryset):
    '''returns a list of objects matching the query'''
    result = []
    try:
        with open(file, 'rb') as f:
           entry = pickle.load(f)
           os.system('clear')
           if queryset == "all":
               while True:
                   try:
                       result.append(entry)
                       entry = pickle.load(f)
                   except:
                       return result
                       break
           while True:
                try:
                    if re.search(queryset, entry.title) or re.search(queryset, entry.tags):
                        result.append(entry)
                        entry = pickle.load(f)
                    else:
                        entry = pickle.load(f)
                except:
                    return result
                    break
    except:
        print('no entries in file, please enter an entry first')
        pause = input('\nPress [Enter] to continue...')

def choices(list_result):
    '''takes a list of objects and returns the index of the selected object'''
    os.system('clear')
    index = 0
    for entry in list_result:
        print('{}. {}'.format(index, entry.title))
        index += 1
    try:
        choice = int(input('\nEnter choice: '))
        return choice
    except:
        pause = input('\nplease enter a valid choice')
        choices(list_result)


def print_choice(list_result, choice):
    '''takes a list of objects and an index and displays the index of the list'''
    os.system('clear')
    print('===================')
    print(list_result[choice].title)
    print('===================')
    for line in list_result[choice].code:
       print(line, end="")
    print('\n\n')
    back_to_choices(list_result)

def back_to_choices(list_result):
    print('1. Back to entry list')
    print('2. Back to Main Menu')
    choice = input(':')
    if choice == "1":
        print_choice(list_result, choices(list_result))
    elif choice == "2":
        pass
    else:
        print('\nplease enter a valid choice')
        back_to_choices(list_result)

1 Ответ

1 голос
/ 26 июля 2010

В else вы снова вызываете функцию main. Вместо этого я бы сделал что-то вроде choice == "0", что приведет к тому, что цикл while будет запрашивать другую запись. Это позволяет избежать бессмысленной рекурсии.

...