概要
改善されたPythonコーディングルール
-
美しさ優先: 醜さよりも美しいコードを追求します。 (美しさ>醜さ)
-
明示性優先: 暗黙的なものよりも明示的なコードを記述します。 (明示的>暗黙的)
-
シンプルさの追求:複雑さよりもシンプルさを追求します。 (単純>複雑)
-
簡潔さ維持:複雑なコードよりも簡潔なコードを維持します。 (簡潔>複雑)
-
平面構造: 入れ子構造よりも平面的な構造を好みます。 (平面 > 入れ子)
-
希少性維持: 密なコードよりも希少なコードを維持します。 (希少>密)
-
可読性優先: コードの読みやすさを最優先事項として考えます。 (可読性の重要)
-
実用性優先:純粋さよりも実用性を優先します。 (実用 > 純粋)
-
例外処理: エラーは明確に処理し、意図的に沈黙させない限り無視しません。 (エラークリア処理、サイレントX)
-
曖昧さ回避:あいまいな状況から推測せず、明確な解決策を探します。 (曖昧さ回避、明確な解決)
-
単一方法: 問題を解決する明確で単一の方法を追求します。 (単一方法を追求)
-
ネームスペースの活用: ネームスペースを積極的に活用してコードのモジュール性を高めます。(名前空間積極活用)
-
良いコードの基準: 実装を説明しやすい場合は、良いコードである可能性が高いです。 (説明しやすいコード)
-
例外は慎重に: 特別な場合が規則を破るほど特別であるか慎重に判断します。
詳細
- 美しさ優先:
# 醜いコード(読みやすくなる)
def calculate_area(x, y, z): return x*y if z == 1 else x*y*z
# 美しいコード(可読性が高い)
def calculate_area(length, width, height_or_one=1):
if height_or_one == 1:
return length * width
else:
return length * width * height_or_one
- 明示性優先:
# 暗黙のコード(意味が明確ではありません)
def process(data):
if data:
return data * 2
return 0
# 明示的なコード(意味が明確です)
def double_positive_number(number):
if isinstance(number, int) and number > 0:
return number * 2
return 0
- シンプルさの追求:
# 複雑なロジック(不要な条件文のネスト)
def check_number(value):
if isinstance(value, int):
if value > 0:
if value % 2 == 0:
return "正と偶数です。"
else:
return "正と奇数です。"
else:
return "正の数ではありません。"
else:
return "数値ではありません。"
# 単純なロジック(単一条件文として処理)
def check_number_simple(number):
if not isinstance(number, int):
return "数値ではありません。"
if number <= 0:
return "正の数ではありません。"
return "正と偶数です。" if number %2 == 0 else "正で奇数です。"
- 簡潔さの維持:
# 複雑なコード(長い関数)
def process_data(data):
result=[]
for item in data:
if item > 0:
new_item=item*2
result.append(new_item)
return result
# 簡潔なコード(関数の分離とリストの実装)
def double_positive(item):
return item*2
def process_data_simple(data):
return [double_positive(item) for item in data if item > 0]
- 平面構造:
# 入れ子になった構造(辞書内の辞書)
nested_dict = {
'level1': {
'level2': {
'level3': 'value'
}
}
}
# フラット構造
flat_dict = {
'level1.level2.level3': 'value'
}
- 希少性維持:
# 密集したコード
a=1; b=2; c=3; print(a,b,c)
# 希少なコード
a = 1
b = 2
c = 3
print(a, b, c)
- 可読性優先:
# 読みやすさの低いコード
def f(x,y): return x * y + x - y
# 読みやすいコード
def calculate_result(first_number, second_number):
product = first_number * second_number
result = product + first_number - second_number
return result
- 実用性優先:
# 純粋さを追求したコード
def pure_function(x):
return x + 2
# 実用性を追求したコード(必要に応じて副作用を含む)
counter = 0
def increment_counter_and_get(x):
# グローバルカウンター
counter += 1
print('counter value', counter) # 副作用 (print)
return x + 2
- 例外処理:
def divide(a, b):
try:
if b == 0:
raise ValueError("0 で除算できません。")
return a/b
except ValueError as e:
print("エラー発生:", e) # エラーログ
return None # エラー状況の適切な値を返す
- 曖昧さ回避:
# あいまいなコード(意味が不明)
def process_input(input):
if input:
return input * 2
return False
# 明確なコード(タイプと条件の明確さ)
def double_number_or_return_false(input_value):
if isinstance(input_value, int):
return input_value * 2
return False
- 単一方法:
# 問題を解決するいくつかの方法(混乱の原因)
def sum_numbers_1(numbers):
total=0
for number in numbers:
total += number
return total
def sum_numbers_2(numbers):
return sum(numbers)
# シングルメソッド(sum関数を使用)
def sum_numbers(numbers):
return sum(numbers)
- 名前空間の活用:
# 名前空間なしでグローバルスコープ汚染
utility1={
'add': lambda a, b: a + b
}
utility2 = {
'add': lambda a, b: a + b
}
# 名前空間を活用してモジュール化
class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def subtract(a, b):
return a - b
class StringUtils:
@staticmethod
def capitalize(text):
return text[0].upper() + text[1:]
@staticmethod
def reverse(text):
return text[::-1]
- 良いコードの基準:
# 説明が難しいコード(複雑なロジック)
def some_function(a, b, c, d):
result = 0
if a > 0:
if b > 0:
if c > 0:
result = a + b + c + d
return result
# 説明しやすいコード
def calculate_sum_of_positive_numbers(a, b, c, d):
if a <= 0 or b <= 0 or c <= 0:
return 0
return a+b+c+d
- 例外は慎重に:
# 一般的な規則に従うコード
def common_logic(number):
return number * 2
# 特別な場合にルールを破るコード (注意が必要)
def special_logic(number):
if number == 0:
return 0 # 0の特別な処理
return number / 2
# 特別なケースを分離して処理
def process_number(number):
if number == 0:
return 0 # 例外処理
return common_logic(number)