我试图对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
)
是否有任何指导方针可以定义推荐这两个版本中的哪一个,或者两者都没问题?
答案 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