如何实现Python类的条件式参数传入以消除代码重复?
减少类实例化时的重复代码(条件式参数传入)
问题场景
你定义了如下User模型类:
class User(db.Model, CommonFields): __tablename__ = "user" __table_args__ = {"schema": "metadata"} email = db.Column(db.String) name = db.Column(db.String) client = db.relationship("Clients", secondary=client_group)
在create_user函数中执行数据库插入时,因client_group可能为空,不得不通过if分支重复编写User实例化代码,存在明显冗余:
def create_user( email: str, name: str, client_group: str ): client_group = Client.get_client(client_group) if client_group: user = User( email=email, name=name, client=[client_group] ) else: user = User( email=email, name=name, ) user = user.insert() return user_schema.dump(user)
希望去掉if分支,实现无重复代码的条件式参数传入。
解决方案
方法1:字典解包+动态键值对
先构造基础参数字典,再根据client_group是否存在动态添加client键,最后通过**解包传入User构造函数:
def create_user( email: str, name: str, client_group: str ): client_group = Client.get_client(client_group) user_kwargs = { "email": email, "name": name } if client_group: user_kwargs["client"] = [client_group] user = User(**user_kwargs) user = user.insert() return user_schema.dump(user)
方法2:一行式条件参数注入
利用Python字典的条件生成,直接在User实例化时动态传入client参数:
def create_user( email: str, name: str, client_group: str ): client_group = Client.get_client(client_group) user = User( email=email, name=name, **({"client": [client_group]} if client_group else {}) ) user = user.insert() return user_schema.dump(user)
方法3:直接赋值默认空值(更简洁)
如果User模型的client关系字段接受空列表作为初始值,可以直接通过三元表达式赋值,无需额外逻辑:
def create_user( email: str, name: str, client_group: str ): client_group = Client.get_client(client_group) user = User( email=email, name=name, client=[client_group] if client_group else [] ) user = user.insert() return user_schema.dump(user)
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

