如何在Python中创建函数的dict?

如何在Python中创建函数的dict?,python,function,dictionary,lambda,structure,Python,Function,Dictionary,Lambda,Structure,我正在用Python编写一个数据库迁移脚本,在其中我创建了一个字典,可以在不同版本之间迁移数据库。我目前的做法如下: def from1To2(): pass # migration script here def from2To1(): pass # migration script here # etc migrations = { 1: {'up': from1To2}, 2: {'down': from2To1, 'up': from2To3},

我正在用Python编写一个数据库迁移脚本,在其中我创建了一个字典,可以在不同版本之间迁移数据库。我目前的做法如下:

def from1To2():
    pass  # migration script here
def from2To1():
    pass  # migration script here
# etc

migrations = {
    1: {'up': from1To2},
    2: {'down': from2To1, 'up': from2To3},
    3: {'down': from3To2, 'up': from3To4},
    4: {'down': from4To3},
}
但每次创建新迁移时,我都需要编写两个迁移脚本(向上和向下),并将它们放入迁移字典中。由于迁移函数非常小(通常是两行),我想直接将它们写在migrations dict中。在Javascript中,这看起来像:

migrations = {
    1: {
        'up': function(){ addSomeColumn(); recordChange(); }, 
        'down': function(){ dropSomeColumn(); recordChange(); }
    },
    2: etc
}
{1: {'up': <function upgrade at 0x02BE4588>}, 2: {'down': <function downgrade at 0x02BE4618>, 'up': <function upgrade at 0x02BE4540>}}

因为迁移函数通常是两行的,所以我认为我不能使用lambda函数。有人知道用Python直接在dict中编写函数的其他方法吗?欢迎所有提示

为此,您需要使用lambda:

>>> function_dictionary = {'capitalize': lambda text: text.capitalize()}
>>> function_dictionary['capitalize']('word')
'Word'

您可以使用
lambda:addSomeColumn()和recordChange()
,前提是您的函数将返回
True

编写自定义装饰程序:

migrations = {}

def migrate(old_version, new_version):
    assert abs(new_version-old_version)==1

    def decorator(f):
        direction = 'up' if new_version > old_version else 'down'
        if old_version not in migrations:
            migrations[old_version] = {}
        migrations[old_version][direction] = f
        return f
    return decorator

@migrate(1, 2)
def upgrade():
    pass  # migration script here

@migrate(2, 1)
def downgrade():
    pass  # migration script here

@migrate(2, 3)
def upgrade():
    pass  # migration script here
# etc

print(migrations)
其输出类似于:

migrations = {
    1: {
        'up': function(){ addSomeColumn(); recordChange(); }, 
        'down': function(){ dropSomeColumn(); recordChange(); }
    },
    2: etc
}
{1: {'up': <function upgrade at 0x02BE4588>}, 2: {'down': <function downgrade at 0x02BE4618>, 'up': <function upgrade at 0x02BE4540>}}
{1:{'up':},2:{'down':,'up':}

装饰负责更新
迁移
字典,但通过这种方式,函数可以有任何名称或重复使用相同的名称,也可以在其他模块中(例如,一个文件用于版本1到2并回滚,另一个文件用于版本2到3并回滚)。

如果创建lambda列表的dict?比如:
migrations={1:[lambda:add_some_column(),lambda:record_change()}
但正如我在问题中所描述的:据我所知,不能用两行代码运行lambda函数。我的许多迁移函数都包含两行代码。。