0
class Tasks(object):
    def __init__(self, container=None):
        if container is None:
            container = []
        self.container = container


    def add(self,name,date,priority):
        self.container.append([name,date,priority])

    def __str__(self):
        return str(self.container)

    def __repr__(self):
        return str(self.container)

    def __getitem__(self, key):
        return Tasks(self.container[key])

    def __len__(self):
        return len(self.container)


class management(Tasks):
    def save(self):
        outfile = open ("tasks.txt","w")
        outfile.write(("\n".join(map(lambda x: str(x), task))))

        print task
        outfile.close ()
    def load(self):
        load_file = open("tasks.txt","r")
        task = load_file.readlines()
        print task
        #this line is the attempt to convert back into the original format
        Tasks(add(task))




task = Tasks()        
if __name__== "__main__":

    p = management(Tasks)

    #task.add("birthday","27092012","high")
    #task.add("christmas","20062000","medium")
    #task.add("easter","26011992","low")
    print task

    #print len(task)
    #p.save()
    p.load()


    print "test",task
    print len(task)

私のコードの最終的な目的は、タスクマネージャーを生成することです(to doリスト)

上記のコードは[name、date、priority]のリストを生成し、それをtasks.txtというテキストファイルに保存します-これが完全に機能することを認識している限り(p.loadをコメントアウトする限り)。

ただし...load関数はファイルをロードしますが、p.load()をコメントアウトしたときと同じように、ロードするリストを印刷タスクとして印刷できる必要があります。

これにより、最終的には、タスクの削除、並べ替えなどを行うことができるようになります。

前もって感謝します

1行目で言い方がわからなかった悪い質問をお詫びします

編集: リスト形式を保持するピクルスについて考えましたが、引数を印刷タスクとして印刷できるようにするために、引数をTasks()クラスに戻すことができるという私の問題が解決されるとは思いません。

編集2 ロード関数は今読み取ります

 def load(self):
     with open("tasks.txt", "r") as load_file:
         tasks = [ast.literal_eval(ln) for ln in load_file]
     print tasks
     for t in tasks:
         todo.add(t)

明らかに(または少なくとも私は思う)エラーNameErrorが発生します:グローバル名'todo'が定義されていませんtask.add(t)で試し、TypeErrorを取得します:add()は正確に4つの引数を取ります(2つ指定)

また、Tasks.add(t)を試してみたところ、エラーTypeErrorが発生しました。バインドされていないメソッドadd()は、最初の引数としてTasksインスタンスを使用して呼び出す必要があります(代わりにリストインスタンスを取得します)

私は明らかにコードを理解していません、あなたは明確にしてくれますか、ありがとう。

Trueのときに3 を編集:menu_choice = int(input( "メニューから数値を選択"))

try:
    if menu_choice == 1:

        task = raw_input ("task")
        date = raw_input ("date")
        priority = raw_input ("priority")
        tasks = Tasks([(task,date,priority)])
        print tasks


    elif menu_choice == 2:
        print tasks
    elif menu_choice == 3:
        tasks.save()
    elif menu_choice == 4:
        tasks.load()
except:
    print sys.exc_info()

これは、タスクを追加する代わりに毎回上書きします、何かアイデアはありますか?また、メニューの選択肢2、3、4は、タスクがグローバルに定義されていないため機能しません。これを回避する方法がわかりませんか?多分戻ってきますか?

4

2 に答える 2

2

名前、タスク、優先度が単純なPythonオブジェクトであると仮定すると、次のコマンドでそれらをロードできますast.literal_eval

with open("tasks.txt", "r") as load_file:
    # no need for readlines, just loop over the file!
    tasks = [ast.literal_eval(ln) for ln in load_file]

次に、ループしtasksてオブジェクトをオブジェクトに配置しTasksます。それは機能しないことに注意してくださいTasks(add(task))。あなたはタイプのオブジェクトを持っている必要があり、それを(それを呼びましょう)Tasksに渡し、そしてしますloadtodo

for t in tasks:
    todo.add(t)

managementところで、クラスは必要ありません。2つの独立した関数で十分です。PythonはJavaではありません

于 2012-05-20T08:41:26.250 に答える
0

別の、よりPythonicなアプローチを試してみてください。答えはそれほど多くありませんが、より多くの選択肢があります。新機能のリクエストの数を考慮して3回編集しました。

import pickle

class TasksError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

class Task(object):
    def __init__(self, task = () ):
        if task ==():
            raise TasksError('Empty task.')
        self.name = task[0]
        self.date = task[1]
        self.priority = task[2]

    def __str__(self):
        output = '''Name: %s
Date: %s
Priority: %s
''' % ( self.name,
        self.date,
        self.priority )
        return output

class Tasks(object):
    def __init__(self, container = []):
        self.container = [ Task(todo) for todo in container ]

    def find_by_priority(self, priority = 'high'):
        # example method to seek and print high priority tasks
        # using this example, you will be able to conduct many
        # types of searches
        results = [ task
                   for task in self.container
                   if task.priority == priority ]
        return results

    def sort_by_date(self):
        # example method of how to sort, again, many other
        # ways of sorting can be implemented, this is just
        # to demonstrate the principle
        # for more info on sorting,
        # visit:  http://wiki.python.org/moin/HowTo/Sorting
        self.container = sorted(self.container,
                                key=lambda task: task.date)

    def add(self, task):
        if task == '':
            raise TasksError('Empty task')
        self.container.append( Task(task) )

    def save(self):
        try:
            output = open('tasks.pkl', 'wb')
            pickle.dump(self.container, output)
            output.close()
        except:
            raise TasksError('Failed to save.')

    def load(self):
        try:
            pkl_file = open('tasks.pkl', 'rb')
            self.container = pickle.load(pkl_file)
            pkl_file.close()
        except:
            raise TasksError('Failed to load')

    def __str__(self):
        output = '\n'.join( [ str(todo) for todo in self.container ] )
        return output

if __name__== "__main__":
    divider = '-' * 30 + '\n'

    tasks = Tasks( [("birthday","20121111","high"),
                    ("christmas","20121225","medium"),
                    ("easter","20120405","low")] )
    print 'Three original tasks:\n'
    print tasks # prints out three tasks
    print divider

    tasks.add( ("new-task","20120320","high") )
    print 'Three original plus one new task:\n'
    print tasks # prints out four tasks
    print divider

    tasks.save() # pickles the task list and saves to disk

    tasks = Tasks( container = [] ) # creates a new, empty task list
    print 'Empty task list:\n'
    print tasks # prints out empty list
    print divider

    tasks.load() # loads the pickled list
    print 'The four pickled tasks, reloaded:\n'
    print tasks # prints out four tasks
    print divider

    while True:
        print divider, '''Make your selection:
1. Add new task
2. Print all tasks
3. Save tasks
4. Load tasks from disk
5. Find high priority tasks
6. Sort by date
<ENTER> to quit
'''
        try:
            menu_choice = int(input("Select a number from the menu: "))
        except:
            print 'Goodbye!'
            break

        if menu_choice == 1:
            # note: no error checking here
            # even an empty input is accepted
            task = raw_input (">>> Task: ")
            date = raw_input (">>> Date as string YYYYMMDD: ")
            priority = raw_input (">>> Priority: ")
            todo = (task, date, priority)
            # note that here you should add a task
            # your method created a NEW task list
            # and replaced the old one
            tasks.add( todo )
            print tasks
        elif menu_choice == 2:
            print divider, 'Printing all tasks'
            print tasks
        elif menu_choice == 3:
            print divider, 'Saving all tasks'
            tasks.save()
        elif menu_choice == 4:
            print divider, 'Loading tasks from disk'
            tasks.load()
        elif menu_choice == 5:
            print divider, 'Finding tasks by priority'
            results = tasks.find_by_priority(priority='high')
            for result in results: print result
        elif menu_choice == 6:
            print divider, 'Sorting by date'
            tasks.sort_by_date()
            print tasks

重要な注意:これは、実装しようとしている機能の多くを示し、オブジェクト指向設計を適切に使用することで、各タスクとタスクリストをカプセル化し、それらを簡単に操作できることを示すための演習として作成されたコードです。また、元の質問で使用していたテキストファイルの実装に代わるPythonicとしてpickleを使用する方法も示しています。また、2つの簡単な方法を実装して、フィールドによる検索と並べ替えを示します。

このプロジェクトに真剣に取り組んでいる場合は、 SQLiteなどの適切なデータベースを調べる必要があります。これにより、手動で確実に実装できるよりも多くの機能を検索、並べ替え、更新、追加、および削除できるようになります。

于 2012-05-20T09:34:51.963 に答える