elif和else的区别?
Distinction between elif and else?
我在Python中有以下功能:
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
result = []
input_length = len(saml_authentication_attributes[groups])
if input_length == 0:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
if input_length == 1:
result = [t.strip() for t in saml_authentication_attributes[groups][0].split(',')]
elif input_length:
result = saml_authentication_attributes[groups]
return result
是否有任何 benefits/drawbacks(除了逻辑控制流)——速度、内存等——用 else
子句替换那里的 elif
?
这样更好吗:
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
input_length = len(saml_authentication_attributes[groups])
if input_length == 0:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
return [t.strip() for t in saml_authentication_attributes[groups][0].split(',')] \
if len(saml_authentication_attributes[groups]) == 1\
else saml_authentication_attributes[groups]
一个else
会更清楚。您的 elif
将始终 运行,因此没有必要对其设置条件。
您的第一个函数已经足够可读,性能不太可能成为问题。为了在短函数中获得最大的可读性,我会这样写:
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
inp = saml_authentication_attributes[groups]
if inp:
if len(inp) == 1:
return [t.strip() for t in inp[0].split(',')]
else:
return inp
else:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
在我看来,这使流程一目了然。 else
都是不必要的(因为如果条件为真,函数将已经 return
ed)并且只是为了使它更明确。 Some 更喜欢在 return
之后省略 else
。
对于较长的函数,将所有主要逻辑都嵌套起来会很痛苦,并且不再清楚末尾的尾随 else
所指的是什么条件,因此更方便处理顶部参数的基本问题。
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
inp = saml_authentication_attributes[groups]
# get the no input error out of the way
if not inp:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
# now do everything else (no need for else)
if len(inp) == 1:
# etc.
我设法缩短了函数的第二个版本,使其既可读又简洁:
def _extract_grp_entitlements(self,groups):
groups_length = len(groups)
if groups_length == 0:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
return [t.strip() for t in groups[0].split(',')] \
if groups_length == 1\
else groups
我在Python中有以下功能:
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
result = []
input_length = len(saml_authentication_attributes[groups])
if input_length == 0:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
if input_length == 1:
result = [t.strip() for t in saml_authentication_attributes[groups][0].split(',')]
elif input_length:
result = saml_authentication_attributes[groups]
return result
是否有任何 benefits/drawbacks(除了逻辑控制流)——速度、内存等——用 else
子句替换那里的 elif
?
这样更好吗:
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
input_length = len(saml_authentication_attributes[groups])
if input_length == 0:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
return [t.strip() for t in saml_authentication_attributes[groups][0].split(',')] \
if len(saml_authentication_attributes[groups]) == 1\
else saml_authentication_attributes[groups]
一个else
会更清楚。您的 elif
将始终 运行,因此没有必要对其设置条件。
您的第一个函数已经足够可读,性能不太可能成为问题。为了在短函数中获得最大的可读性,我会这样写:
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
inp = saml_authentication_attributes[groups]
if inp:
if len(inp) == 1:
return [t.strip() for t in inp[0].split(',')]
else:
return inp
else:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
在我看来,这使流程一目了然。 else
都是不必要的(因为如果条件为真,函数将已经 return
ed)并且只是为了使它更明确。 Some 更喜欢在 return
之后省略 else
。
对于较长的函数,将所有主要逻辑都嵌套起来会很痛苦,并且不再清楚末尾的尾随 else
所指的是什么条件,因此更方便处理顶部参数的基本问题。
def _extract_grp_entitlements(self,saml_authentication_attributes,groups):
inp = saml_authentication_attributes[groups]
# get the no input error out of the way
if not inp:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
# now do everything else (no need for else)
if len(inp) == 1:
# etc.
我设法缩短了函数的第二个版本,使其既可读又简洁:
def _extract_grp_entitlements(self,groups):
groups_length = len(groups)
if groups_length == 0:
log.error(self.empty_entitlements_message)
raise RuntimeError(self.empty_entitlements_message)
return [t.strip() for t in groups[0].split(',')] \
if groups_length == 1\
else groups