[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 "", 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'
>>> 
这里运行一半就出现了一个TypeError错误,估计是我们的print_lol函数写错了,我们回头审视下我们的函数,发现在递归调用时没有改用新的print_lol函数,而是使用之前的:print_lol(item_1),这里进行修改为print_lol(item_1,level),但是此时我们再考虑一下,只是简单的传入level是否正确呢?每当嵌套深一层,我们的缩进就应该有所增加,所以这里改为print_lol(item_1,level+1),修改后的代码如下:
"""这里是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上了。

评论关闭