我正在寻找一种更动态的方法来以编程方式生成这些函数,因为所有这些函数本质上都涉及使用不同的ReasonOptions调用send_otp方法. (我不想在我调用它们的地方设置ReasonOptions)

class OtpBusinessLogicLayer(Manager, BaseOtp):
    def send_forget_password_otp(self, identifier):
        return self.send_otp(identifier, reason=ReasonOptions.FORGET_PASSWORD)

    def send_phone_number_activation_otp(self, phone_number: str):
        return self.send_otp(phone_number, reason=ReasonOptions.PHONE_NUMBER_ACTIVATION)

    def send_two_step_auth_activation_otp(self, email: str):
        return self.send_otp(email, reason=ReasonOptions.ENABLE_TWO_STEP_AUTH)

    def send_two_step_auth_deactivation_otp(self, email: str):
        return self.send_otp(email, reason=ReasonOptions.DISABLE_TWO_STEP_AUTH)

    def send_change_user_identifier_otp(self, email: str):
        return self.send_otp(email, reason=ReasonOptions.CHANGE_USER_IDENTIFIER)

推荐答案

您可以循环遍历所有原因名称的列表并生成具有lambda的函数.

class OtpBusinessLogicLayer(Manager, BaseOtp):
    pass

reasons = ['forget_password', 'phone_number_activation', ...]
for r in reasons:
    setattr(OtpBusinessLogicLayer, f'send_{r}_otp', lambda self, identifier, r=r: elf.send_otp(identifier, reason=getattr(ReasonOptions, r.upper()))

有关lambdar=r的说明,请参见What do lambda function closures capture?.

Python相关问答推荐

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

Polars LazyFrame在收集后未返回指定的模式顺序

韦尔福德方差与Numpy方差不同

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

numpy卷积与有效

pyscript中的压痕问题

迭代嵌套字典的值

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

干燥化与列姆化的比较

Odoo16:模板中使用的docs变量在哪里定义?

如果包含特定值,则筛选Groupby

30个非DATETIME天内的累计金额

如何在Gekko中使用分层条件约束

根据Pandas中带条件的两个列的值创建新列

numpy数组和数组标量之间的不同行为

Seaborn散点图使用多个不同的标记而不是点

高效地计算数字数组中三行上三个点之间的Angular

如何将django url参数传递给模板&S url方法?

S最大值除以最小值,然后减1的结果是什么?