2010-07-26 2 views
0

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

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

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

он не был разработан с учетом миллионов записей, поэтому я просто использую файл pickle для сериализации данных вместо одного из 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) 
+0

для инструментов командной строки, есть модуль под названием «cmd», который я использовал несколько раз. Это может облегчить вашу жизнь. –

ответ

1

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

Смежные вопросы