2021-04-02 一个简单的Python代码优化实例

200 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

代码优化 Git效果

1    def get_object(self) -> IMUser:
2        user_id = (member := self.request.member).imuser
3        if not (obj := IMUser.normal.filter(user_id=user_id).first()):
4 -           obj = IMUser(
5 +           obj = IMUser.objects.create(
6                origin_id=member.id,
7                role=member.role,
8                nickname=member.nickname,
9                open_id=member.openid,
10                user_id=user_id,
11 +              phone=member.phone
12            )
13 -     obj.phone = member.phone
14 -       obj.save()
15 -       return IMUserLoginOrCreate.build_rc_token(obj)
16 +       elif obj.phone != member.phone:
17 +           obj.phone = member.phone
18 +           obj.save()
19 +       self.build_rc_token(obj)
20 +       return obj

21    @staticmethod
22 -  def build_rc_token(obj: IMUser) -> IMUser:
23 +  def build_rc_token(obj: IMUser) -> None:
24        if not obj.im_token:
25           res = RongUser.register(
26 -             obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_url
27 +             obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_uri
28           )
29           if res and res.get("code") == 200:
30               obj.im_token = res.get("token")
31               obj.save()
32 -      return obj

优化前的代码

1 class IMUserLoginOrCreate(generics.RetrieveUpdateAPIView):
2    """
3    get: 注册IM用户
4    post: 修改用户
5    """
6
7    queryset = IMUser.normal.filter()
8    serializer_class = IMUserSerializer
10
11   def get_object(self) -> IMUser:
12      user_id = (member := self.request.member).imuser
13      if not (obj := IMUser.normal.filter(user_id=user_id).first()):
14          obj = IMUser(
15              origin_id=member.id,
16              role=member.role,
17              nickname=member.nickname,
18              open_id=member.openid,
19              user_id=user_id,
20          )
21      obj.phone = member.phone
22      obj.save()
23      return IMUserLoginOrCreate.build_rc_token(obj)
24
25  @staticmethod
26  def build_rc_token(obj: IMUser) -> IMUser:
27      if not obj.im_token:
28          res = RongUser.register(
29              obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_url
30          )
31          if res and res.get("code") == 200:
32              obj.im_token = res.get("token")
33              obj.save()
34      return obj

优化后的代码

class IMUserLoginOrCreate(generics.RetrieveUpdateAPIView):
    """
    get: 注册IM用户
    post: 修改用户
    """

    queryset = IMUser.normal.filter()
    serializer_class = IMUserSerializer

    def get_object(self) -> IMUser:
        user_id = (member := self.request.member).imuser
        if not (obj := IMUser.normal.filter(user_id=user_id).first()):
            obj = IMUser.objects.create(
                origin_id=member.id,
                role=member.role,
                nickname=member.nickname,
                open_id=member.openid,
                user_id=user_id,
                phone=member.phone
            )
        elif obj.phone != member.phone:
            obj.phone = member.phone
            obj.save()
        self.build_rc_token(obj)
        return obj

    @staticmethod
    def build_rc_token(obj: IMUser) -> None:
        if not obj.im_token:
            res = RongUser.register(
                obj.user_id, name=obj.nickname, portrait_uri=obj.portrait_uri
            )
            if res and res.get("code") == 200:
                obj.im_token = res.get("token")
                obj.save()

优化原因:

应该判断phone是否有变化再决定是否save,数据库操作是很耗时的,尽量减少数据库操作 build_rc_token顾名思义是用来创建token的,让它成为一个动作就好,不应返回obj;如果要返回obj应该换一个函数名 待优化:

不应使用GET来注册,应该用POST,然后PATCH或PUT来修改用户