2014-01-16 59 views
2

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

有一个定义,建议这两个版本的,或者都是OK的任何指引?

+0

我会只通过'email'直接,而不是传递整个对象。 – thefourtheye

回答

3

第一个版本应该是首选。这不仅仅适用于Python,而且适用于其他语言,如C++/Java,因为它很容易出错,并且按照Python Errors should never pass silently.的Zen,在第二个版本中就是这种情况。

的原因:

考虑,客户端的实例化失败,导致返回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 
+0

“第一个版本应该首选...因为它容易出错”? – martineau

3

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)