这两种编码风格中的哪一种更好?两者都符合PEP8

时间:2014-01-16 14:05:58

标签: python coding-style pep8

我试图对PEP8编码风格非常严格,但这个问题还没有得到解答。这些是相同代码的两个版本,一个是使用临时变量,每个临时变量只使用一次,另一个版本不使用临时变量,看起来更像是函数式语言中常见的变量。

对我而言,功能性的看起来更漂亮,但我不确定是否有关于我应该链接多少功能的指南。

带临时变量的版本:

   class EmailConfirmation():

       @receiver(email_confirmed)
       def confirmed(sender, **kwargs):
           email = kwargs['email_address'].email
           keystone_id = User.objects.get_by_natural_key(email).keystone_id
           client = Client(token=settings.KEYSTONE_TOKEN,
                           endpoint=settings.KEYSTONE_URL)
           client.users.update(keystone_id, enabled=True)

没有临时变量的版本:

  class EmailConfirmation():

      @receiver(email_confirmed)
      def confirmed(sender, **kwargs):
          Client(
              token=settings.KEYSTONE_TOKEN,
              endpoint=settings.KEYSTONE_URL
          ).users.update(
              User.objects.get_by_natural_key(
                  kwargs['email_address'].email
              ).keystone_id, enabled=True
          )

是否有任何指导方针可以定义推荐这两个版本中的哪一个,或者两者都没问题?

2 个答案:

答案 0 :(得分:3)

PEP8并未规定是否使用临时变量。

但是,对我而言,第二个版本看起来并不是Pythonic:大多数Python代码都避免使用类似链接的方法。我甚至可能存储用户而不是keystone_id:

user = User.objects.get_by_natural_key(email)
client = Client(token=settings.KEYSTONE_TOKEN,
                endpoint=settings.KEYSTONE_URL)
client.users.update(user.keystone_id, enabled=True)

答案 1 :(得分:3)

应首选第一个版本。这不仅适用于Python,而且适用于其他语言(如C ++ / Java),因为它容易出错并且符合Python的Errors should never pass silently.,这将是您的第二个版本中的情况。

原因:

考虑一下,Client的实例化失败,导致返回None。链接同一个对象而不检查成功或正确的错误处理会导致与实际问题无关的错误AttributeError: 'NoneType' object has no attribute 'users'

因此,避免链接对象总是更好,因为这会导致错误无声地传递。

示例

考虑对您的第一个版本进行以下修改

class EmailConfirmation():
   @receiver(email_confirmed)
   def confirmed(sender, **kwargs):
       email = kwargs['email_address'].email
       keystone_id = User.objects.get_by_natural_key(email).keystone_id
       try:
           client = Client(token=settings.KEYSTONE_TOKEN,
                           endpoint=settings.KEYSTONE_URL)
       except CustomClientError as e:
           # Your Error Handling Code goes here
           raise CustomClientError("Your Error Message")
       else:
           if client.users:
               client.users.update(keystone_id, enabled=True)
           else:
               raise CustomEmailError("Your Error Message")
       finally:
           # Cleanup code goes here