[Python实战0]修改上传到PyPI上的Python代码
[Python实战0]修改上传到PyPI上的Python代码
在上一篇文章中,我们已经上传了一个wukong模块到PyPI网站,其中里面有一个print_lol函数,这个函数可以用来输出列表,但是这个函数有一个问题,即对于嵌套的列表输出时没有缩进,如下:>>> import wukong >>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]], "The Life of Brain",1979,"Terry Jones",94, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]] >>> wukong.print_lol(movies) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones The Life of Brain 1979 Terry Jones 94 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones >>>
如上,我们可以看到,所有的输出结果都没有进行缩进,而我们有的时候是需要对嵌套的列表进行缩进的,所以此时我们就遇到了一些问题,我们可以重新编写一个print方法,专门用来处理缩进问题,但这样毕竟增加了代码量,另一个方法就是我们在已有的代码上进行修改,这样我们就不需要做重复性的工作了。
但是我们如何来控制当前的print_lol方法来进行列表的嵌套缩进呢?一个方法就是使用额外的参数来控制print的行为,但是添加一个什么样的参数呢?在Python中给我们提供了一个内置函数:range()
使用range()迭代固定次数
range()可以用来指定迭代的次数,而且还可以用来生成一个从0直到(但不包含),某个数的数字列表,如下:>>> for num in range(4): print(num) 0 1 2 3 >>>好的,下面我们就修改print_lol方法,可以让其进行缩进,修改后如下:
"""这里是wukong模块,print_lol函数专门用来输出一个列表""" """增加一个level参数,表示在遇到嵌套输出时控制制表符的输出""" def print_lol(movies,level): for item_1 in movies: if isinstance(item_1,list): print_lol(item_1) else: for tab_stop in range(level): print("\t",end='') print(item_1)好的,修改完成以后,我们按F5重新启动Python Shell,然后运行代码:
>>> ================================ RESTART ================================ >>> >>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]], "The Life of Brain",1979,"Terry Jones",94, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]] >>> print_lol(movies,0) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Traceback (most recent call last): File "这里运行一半就出现了一个TypeError错误,估计是我们的print_lol函数写错了,我们回头审视下我们的函数,发现在递归调用时没有改用新的print_lol函数,而是使用之前的:print_lol(item_1),这里进行修改为print_lol(item_1,level),但是此时我们再考虑一下,只是简单的传入level是否正确呢?每当嵌套深一层,我们的缩进就应该有所增加,所以这里改为print_lol(item_1,level+1),修改后的代码如下:", line 1, in print_lol(movies,0) File "D:\python\wukong\wukong.py", line 6, in print_lol print_lol(item_1) TypeError: print_lol() missing 1 required positional argument: 'level' >>>
"""这里是wukong模块,print_lol函数专门用来输出一个列表""" """增加一个level参数,表示在遇到嵌套输出时控制制表符的输出""" def print_lol(movies,level): for item_1 in movies: if isinstance(item_1,list): print_lol(item_1,level+1) else: for tab_stop in range(level): print("\t",end='') print(item_1)再次运行,结果如下:
>>> ================================ RESTART ================================ >>> >>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]], "The Life of Brain",1979,"Terry Jones",94, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]] >>> print_lol(movies,0) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones The Life of Brain 1979 Terry Jones 94 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones >>>我们可以看到,所有的嵌套都进行了缩进处理。现在我们可以更新PyPI上的代码了。
更新PyPI上的代码
好了,我们在本地修改完成代码以后,接着就要更新PyPI上的代码了,在更新之前,我们首先要修改setup.py,把其中的版本号改为1.1.0(以前是1.0.0),如下:"""从python发布工具导入setup函数""" from distutils.core import setup """设置setup函数的参数,其中py_modules为我们将要发布的模块,这里为wukong.py,所以值为wukong""" setup( name = 'wukong', version = '1.1.0', py_modules = ['wukong'], author = 'wukongcode', author_email = 'bjwangzhen@pku.edu.cn', url = 'http://blog.csdn.net/wukongcode', description = 'A simple printer of nested lists', )完成之后我们再次执行python setup.py sdist upload进行更新PyPI上的代码:
使用可变参数
当我们更新完成PyPI上的代码以后,别人看到了,紧跟着也下载更新了自己本地的代码,但是此时造成了一个问题:之前使用print_lol打印列表的地方都不能用了,因为在新的模块中print_lol需要两个参数,而之前的版本中只需要一个参数。好了,我知道自己闯祸了,怎么办呢?我们可以使用可变参数来控制第二个参数,即用户可以不传入第二个参数,可以按照之前的版本一样只传入一个参数,听起来是不是很酷?可是,如何使用可变参数呢?很简单,只需要把参数level编程level=0即可,这样如果不输入level的值的话,则level会默认为0,修改后的代码如下:
"""这里是wukong模块,print_lol函数专门用来输出一个列表""" """增加一个level参数,表示在遇到嵌套输出时控制制表符的输出""" def print_lol(movies,level=0): for item_1 in movies: if isinstance(item_1,list): print_lol(item_1,level+1) else: for tab_stop in range(level): print("\t",end='') print(item_1)然后我们再试一下:
>>> ================================ RESTART ================================ >>> >>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]], "The Life of Brain",1979,"Terry Jones",94, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]] >>> print_lol(movies,0) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones The Life of Brain 1979 Terry Jones 94 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones >>> print_lol(movies) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones The Life of Brain 1979 Terry Jones 94 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones >>>可以看到使用print_lol(movies,0)和使用print_lol(movies)效果是一样的,这就解决了刚才的那个问题。
在此更新PyPI上的代码
好了,现在已经迫不及待的把现在这个功能分享个小伙伴了,那我们继续修改setup.py文件,把版本改为:1.2.0,如下:"""从python发布工具导入setup函数""" from distutils.core import setup """设置setup函数的参数,其中py_modules为我们将要发布的模块,这里为wukong.py,所以值为wukong""" setup( name = 'wukong', version = '1.2.0', py_modules = ['wukong'], author = 'wukongcode', author_email = 'bjwangzhen@pku.edu.cn', url = 'http://blog.csdn.net/wukongcode', description = 'A simple printer of nested lists', )然后进行上传:
控制是否缩进
现在我们已经完美的编写了print_lol代码,可以完美的支持缩进了,可是此时有人说了:我能不能自己控制是否缩进呢?有的时候我确实是不需要缩进的。好吧,又一个问题,怎样解决呢?我们当然可以再增加一个参数用来控制是否要缩进,这次我们学聪明了,把此参数定义成可变的,代码如下:"""这里是wukong模块,print_lol函数专门用来输出一个列表""" """增加一个level参数,表示在遇到嵌套输出时控制制表符的输出""" def print_lol(movies,indent=False,level=0): for item_1 in movies: if isinstance(item_1,list): print_lol(item_1,indent,level+1) else: if indent: for tab_stop in range(level): print("\t",end='') print(item_1)现在先进行下测试,如下:
>>> ================================ RESTART ================================ >>> >>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]], "The Life of Brain",1979,"Terry Jones",94, ["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]] >>> print_lol(movies) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones The Life of Brain 1979 Terry Jones 94 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones >>> print_lol(movies,True) The Holy Grail 1975 Terry Jones & Terry Gilliam 91 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones The Life of Brain 1979 Terry Jones 94 Graham chapman Michael Palin John cleese Terry Gilliam Eric Idle & Terry Jones >>>完美的实现了我们想要的,好了再次上传到PyPI上吧。
最后一次上传代码到PyPI
当前的代码堪称是完美,所以我们就开始上传把吧,同样要先修改setup.py中的版本为:1.3.0,如下:"""从python发布工具导入setup函数""" from distutils.core import setup """设置setup函数的参数,其中py_modules为我们将要发布的模块,这里为wukong.py,所以值为wukong""" setup( name = 'wukong', version = '1.3.0', py_modules = ['wukong'], author = 'wukongcode', author_email = 'bjwangzhen@pku.edu.cn', url = 'http://blog.csdn.net/wukongcode', description = 'A simple printer of nested lists', )然后进行上传:
这样,我们就完美的编写了一个模块并上传到了PyPI上了。
评论关闭