简介

怎样更好的去组织Python的函数,使之具有更好的耦合性和健壮性,以便进行更好的分工和协作是一个比较大的话题。
这部分的内容可能会比较庞杂,而且每个人的风格和习惯会不相同,所以后续的内容:

  1. 仅为一家言,看客不必过于纠结其优雅性
  2. 是面向实战应用出发的,大家看了觉得有点用就好
  3. 千头万绪不知从何说起,所以内容没有大纲,我会按功能点的方式逐个覆盖,并试图在最后连起来

思路

通过设定一些通用的简单规范,使函数调用的时候是清晰的,并且可以抽象表示的。

关于函数调用的清晰问题。Python函数的参数有两种形式:位置参数和关键字参数。其中的差别我不展开细说,但是如果是位置参数的画我要按照参数的顺序输入,随着时间一长或者函数一多,我一定会记不住。所以,规范的第一条是函数的参数必须是关键字参数。

另外,我也希望函数能具有一些灵活性,如果需要修改的画我可以不太关注形式上的问题,简单举个栗子:

def abc(**kw):
    x1 = kw.get('a')
    x2 = kw.get('z')
    for k in kw.keys():
        print(k)
    print(x1)
    print(x2)
# 输入
tem_para_dict = {'a':1, 'b':2, 'c':3}
# 调用
In [3]: abc(**tem_para_dict)
   ...: 
a
b
c
1
None

所以,如果需要我在函数体内修改就可以了,函数的参数就是固定的**kw, 不做任何限制,这是规范二。

函数体本身分为三段:1.输入适配、2.核心的逻辑、3.输出适配。这是规范三。但是这个规范本身又比较复杂,简单来说输入适配是确保函数的核心逻辑在处理之前拿到了正确的数据(字段名、字段类型、合法值等等);核心逻辑则是需要嵌入的核心部分;输出适配是为了把结果传递给下一步,也是一个字典的形态,不可以为空。

这部分的细节可以以后再说,规范三确保了每个人可以独立(并行)的完成项目中的工作,对接时没有(或几乎没有)核心逻辑之外的bug。

最后从组织形态上,函数及其调用的参数都是字典化的。特别需要指出的是参数字典,由于某些函数处理原始数据(参数),那么这个参数会非常大。因此这里提到的事实上都是元数据(而非原始数据)。

示例

# 函数字典
func_dict = {}
func_dict['f1'] = abc 

# 参数字典
para_dict = {}
para_dict['p1'] = tem_para_dict

# 调用形式
func_dict['f1'](**para_dict['p1'])

#结果(和上面是一行的):
a
b
c
1
None

这里且不论每个函数的说明文档之类的,通过函数字典(func_dict)和参数字典(para_dict),我们实现了函数调用的抽象化 (f1|p1),有什么用处就需要大家自己体会了,我就抛个砖。

关于函数字典和参数字典的设计和处理当然不会只是这么简单,但也不会有太过深奥的地方。

后续我还会逐步的对这部分内容进行完善,希望看到最后大家能有一些收获。