gpt4 book ai didi

python - 如何在 Python 中创建函数字典?

转载 作者:太空狗 更新时间:2023-10-30 02:29:25 25 4
gpt4 key购买 nike

我正在用 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},
}

但是每次创建新的迁移时,我都需要编写两个迁移脚本(向上和向下)并将它们放入迁移字典中。由于迁移函数非常小(通常是两行),我想到直接将它们写在迁移字典中。在 Javascript 中,这看起来像:

migrations = {
1: {
'up': function(){ addSomeColumn(); recordChange(); },
'down': function(){ dropSomeColumn(); recordChange(); }
},
2: etc
}

因为迁移函数往往是两行,我觉得不能用lambda函数。有人知道在 Python 的字典中直接编写函数的其他方法吗?欢迎所有提示!

最佳答案

编写自定义装饰器:

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)

输出是这样的:

{1: {'up': <function upgrade at 0x02BE4588>}, 2: {'down': <function downgrade at 0x02BE4618>, 'up': <function upgrade at 0x02BE4540>}}

修饰负责更新 migrations 字典,但这样函数可以有任何名称或重复使用相同的名称,或者可以在其他模块中(例如,有一个文件版本1 到 2 和回滚,另一个用于 2 到 3 和回滚)。

关于python - 如何在 Python 中创建函数字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32521350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com