【问题标题】:Which of these two coding-styles is better? Both are compliant with PEP8 [closed]这两种编码风格哪一种更好?两者都符合 PEP8 [关闭]
【发布时间】:2014-01-16 14:05:58
【问题描述】:

我试图对 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
          )

是否有任何指南来定义推荐这两个版本中的哪一个,或者两者都可以?

【问题讨论】:

  • 我只会直接传递email,而不是传递整个对象。

标签: python coding-style pep8


【解决方案1】:

应该首选第一个版本。这不仅适用于 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

【讨论】:

  • “应该首选第一个版本...因为它容易出错”?
【解决方案2】:

PEP8 没有规定是否使用临时变量。

不过,在我看来,第二个版本看起来并不像 Python 风格:大多数 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多