too-many-branches (PLR0912)
源自 Pylint 代码检查工具。
作用
检查具有过多分支的函数或方法,包括(嵌套的)if
、elif
和 else
分支,for
循环,try
-except
子句,以及 match
和 case
语句。
默认情况下,此规则允许最多 12 个分支。 可以使用 lint.pylint.max-branches
选项进行配置。
为什么这不好?
与分支较少的函数或方法相比,具有许多分支的函数或方法更难理解和维护。
示例
给定
def capital(country):
if country == "Australia":
return "Canberra"
elif country == "Brazil":
return "Brasilia"
elif country == "Canada":
return "Ottawa"
elif country == "England":
return "London"
elif country == "France":
return "Paris"
elif country == "Germany":
return "Berlin"
elif country == "Poland":
return "Warsaw"
elif country == "Romania":
return "Bucharest"
elif country == "Spain":
return "Madrid"
elif country == "Thailand":
return "Bangkok"
elif country == "Turkey":
return "Ankara"
elif country == "United States":
return "Washington"
else:
return "Unknown" # 13th branch
建议改为
def capital(country):
capitals = {
"Australia": "Canberra",
"Brazil": "Brasilia",
"Canada": "Ottawa",
"England": "London",
"France": "Paris",
"Germany": "Berlin",
"Poland": "Warsaw",
"Romania": "Bucharest",
"Spain": "Madrid",
"Thailand": "Bangkok",
"Turkey": "Ankara",
"United States": "Washington",
}
city = capitals.get(country, "Unknown")
return city
给定
def grades_to_average_number(grades):
numbers = []
for grade in grades: # 1st branch
if len(grade) not in {1, 2}:
raise ValueError(f"Invalid grade: {grade}")
if len(grade) == 2 and grade[1] not in {"+", "-"}:
raise ValueError(f"Invalid grade: {grade}")
letter = grade[0]
if letter in {"F", "E"}:
number = 0.0
elif letter == "D":
number = 1.0
elif letter == "C":
number = 2.0
elif letter == "B":
number = 3.0
elif letter == "A":
number = 4.0
else:
raise ValueError(f"Invalid grade: {grade}")
modifier = 0.0
if letter != "F" and grade[-1] == "+":
modifier = 0.3
elif letter != "F" and grade[-1] == "-":
modifier = -0.3
numbers.append(max(0.0, min(number + modifier, 4.0)))
try:
return sum(numbers) / len(numbers)
except ZeroDivisionError: # 13th branch
return 0
建议改为
def grades_to_average_number(grades):
grade_values = {"F": 0.0, "E": 0.0, "D": 1.0, "C": 2.0, "B": 3.0, "A": 4.0}
modifier_values = {"+": 0.3, "-": -0.3}
numbers = []
for grade in grades:
if len(grade) not in {1, 2}:
raise ValueError(f"Invalid grade: {grade}")
letter = grade[0]
if letter not in grade_values:
raise ValueError(f"Invalid grade: {grade}")
number = grade_values[letter]
if len(grade) == 2 and grade[1] not in modifier_values:
raise ValueError(f"Invalid grade: {grade}")
modifier = modifier_values.get(grade[-1], 0.0)
if letter == "F":
numbers.append(0.0)
else:
numbers.append(max(0.0, min(number + modifier, 4.0)))
try:
return sum(numbers) / len(numbers)
except ZeroDivisionError:
return 0