python写待办事项清单程序(学习单元测试)

记录学习python过程

--寒假留下来的没有打完的代码,现在打完了,但是觉得自己没有好好的消化。加油啊

学习书里的代办清单处理程序。利用计算机流行的CRUD来进行规范,创建(create)、检索(retrieve)、更新(update)、删除(delete),即包含以下四项基本操作:
1.待办事项的创建(创建)
2.查看已创建的待办事项(检索)
3.编辑待办事项的信息(更新)

主要利用这个程序学习单元测试:将程序划分为很小一部分的单元(函数部分等),确保它们在接受一系列的输入的情况下能够正常;

知识点:

1.assert

assert语句是一种插入调试断点到程序的一种便捷的方式。
用来测试第一部分的条件,若假则引发错误,并且可以输出输出第二部分制定的内容
assert depression
assert something==something_else,“Error_expression”
也等价于:

if _debbug_:
   if not expression:raise AssertionError```
assert也可以用于多个表达式的断言
`assert expression1, expression2`


######2.在测试中导入程序时,不想运行被导入程序的main_loop( )函数,但是直接运行被测试的程序时,又想运行main_loop( )程序,常用if语句块放于测试程序的末尾,确保它使用的所有函数都已定义。其中_ _name_ _指的是当前名称空间,即当前运行的模块名称,如果程序是直接运行的成为_ _main_ _。可以将import todo理解为非直接运行。
```Python
if _ _name_ _=='_ _main_ _'
       main_loop( ) //main_loop是被测试程序里的一个函数
3.在Python中可以将函数、字符串、数字、列表、字典付给变量
4.enumerate函数,接受一个列表或者可迭代对象作为参数,并返回下一个元素及其索引。

一般用于需要同时遍历数组或列表的下标和元素使用。

for index,value in enumerate(list):
       print index,vallue```

######5.string的一些函数
>ljust()方法返回字符串左对齐的字符串长度宽度。填充是通过使用指定的fillchar(默认为空格)。如果宽度小于len(s)返回原始字符串。
语法以下是ljust()方法的语法:
str.ljust(width[, fillchar])

######6.列表解释(很强大)可以用简单的函数和列表解释组合,代替复杂的for循环
>在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。它的基本形式是一个方括号里面包含一个for语句对一个iterable对象迭代,这也是建立python 列表的一个方法

1>下面的代码是:Python会遍历原有的todos,并收集到满足if条件的所有todo,生成新的列表important_todos;
```important_todos=[todo for todo in todos if todo['level'].lower()=="important"```

2>还可以利用列表解释生成新的矩阵

coordinates=[(x,y) for x in range(10)
for y in range(10)]```

3>进行数字运算

squares=[x*x for x in range(20)]
7.textwrap模块的wrap()函数

wrap(string,指定的字符数量)

8、如何利用变量存储函数本身而不是函数结果

例:用户输入的是new,而需要返回的是create_todoo()函数

commands={'new':create_todo,}
def get_function(command_name):
  return commands[command_name]```
这里的commands是一个字典,将包含程序支持的所有命令,函数get_function将返回根据您输入的command_name调用需要的函数.

######9、Python的模块Pickle
主要用于将Python模块的对象写入文件,对对象类型有限制。但是支持字符串、列表和字典
1>load()是从文件中提取已经经过pickle序列化的数据,pickle以自己的方法进行恢复到原来的格式。
2>dump()方法可以把数据对象以特定的格式保存在指定的文件中.
[了解更多pickle](http://www.cnblogs.com/cobbliu/archive/2012/09/04/2670178.html)
######10、文件的相关操作
os模块常用的操作函数
>remove()/unlink()删除文件
rename()/renames()重命名文件
walk()生成一个目录树下的所有文件名
istdir() 列出指定目录的文件


整个TODO的代码:
```python
import textwrap
import os
import pickle
def get_input(fields):
    """To get all user's multple line input"""
    user_input={}
    for field in fields:
        user_input[field]=raw_input(field+">")
    return user_input

def get_function(command_name):
    return commands[command_name][0]

def get_fields(command_name):
    return commands[command_name][1]

def test(todos,abcd,ijkl):
    return "Command 'test' returned:\n"+\
    "abcd:"+abcd+"\nijkl:"+ijkl

def create_todo(todos,title,description,level):
    """create a todo list function"""
    todo={
    'title':title,
    'description':description,
    'level':level,
    }
    todos.append(todo)
    sort_todos()
    return "create todo '%s'."%title

def capitalize(todo):
    todo['level']=todo['level'].upper()
    return todo

#todo 
def show_todo(todo,index):
    wrapped_title=textwrap.wrap(todo['title'],16)
    wrapped_description=textwrap.wrap(todo['description'],24)

    output=str(index+1).ljust(8)+" "
    output+=wrapped_title[0].ljust(16)+" "
    output+=wrapped_description[0].ljust(24)+" "
    output+=todo['level'].ljust(16)
    output+="\n"

    max_len=max(len(wrapped_description),len(wrapped_title))
    for index in range(1,max_len):
        output+=" "*8+" "
        if indexlen(todos):
        return ("'"+str(which)+"' needs to be the number of a todo!")
    del todos[which-1]
    return "Deleted todo #"+str(which)

def edit_todo(todos,which,title,description,level):
    if not which.isdigit():
        return ("'"+which+"' needs to be the number of a todo!")
    which=int(which)
    if which<1 or which>len(todos):
        return ("'"+str(which)+"' needs to be the number of a todo!")

    todo=todos[which-1]
    if title!=" ":
        todo['title']=title
    if description!=" ":
        todo['description']=description
    if level!=" ":
        todo['level']=level

    sort_todos()
    return "Edited todo #"+str(which)

    #Create a dictionary to get the command to run the specified function
#key is a command,value is a function
commands={
    'new':[create_todo,['title','description','level']],
    'show':[show_todos,[]],
    'delete':[delete_todo,['which']],
    'edit':[edit_todo,['which','title','description','level']],
    'test':[test,['abcd','ijkl']],
}
todos=[]

def main_loop():
    user_input=""
    load_todo_list()
    while 1:
        #use user's input
        print run_command(user_input)
        user_input=raw_input(">")
        if user_input.lower().startswith("quit"):
            print "Exting..."
            break
    save_todo_list()
    #when condition was satified main_looop was runs
    """if __name__=='__main__':
        main_loop()"""
main_loop()

你可能感兴趣的:(python写待办事项清单程序(学习单元测试))