「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > すべての開発者が依然として直面している ython のバグとその修正方法)

すべての開発者が依然として直面している ython のバグとその修正方法)

2024 年 10 月 31 日公開
ブラウズ:785

ython bugs that every developer is still facing in and how to fix them)

作者: Rupesh Sharma 別名 @hackyrupesh

Python は、そのシンプルさと美しさで、世界で最も人気のあるプログラミング言語の 1 つです。しかし、2024 年になっても、特定の欠陥が開発者を悩ませ続けています。これらの問題は、必ずしも Python の弱点が原因ではなく、むしろその設計、動作、または予期せぬ結果をもたらす一般的な誤解が原因です。このブログ記事では、2024 年になってもすべての開発者が遭遇する Python の問題のトップ 5 とその解決策を見ていきます。


1. 変更可能なデフォルト引数: サイレントトラップ

問題

Python の最も悪名高いバグの 1 つは、変更可能なデフォルト引数です。変更可能なオブジェクト (リストや辞書など) が関数のデフォルト引数として使用される場合、Python は関数が呼び出されるたびではなく、関数が定義されるときにこのデフォルト引数を 1 回だけ評価します。これにより、関数がオブジェクトを変更するときに予期しない動作が発生します。

def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [1, 2] - Unexpected!
print(append_to_list(3))  # Outputs: [1, 2, 3] - Even more unexpected!

解決策

これを回避するには、デフォルトの引数として None を使用し、必要に応じて関数内に新しいリストを作成します。

def append_to_list(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [2]
print(append_to_list(3))  # Outputs: [3]

参考文献

  • Python のデフォルト引数の落とし穴

2. 辞書のとらえどころのないキーエラー

問題

存在しない辞書キーにアクセスしようとすると、

KeyError が発生します。これは、ネストされた辞書を使用する場合、または構造が保証されていないデータを扱う場合に特に注意が必要です。

data = {'name': 'Alice'}
print(data['age'])  # Raises KeyError: 'age'

解決策

KeyError を防ぐには、キーが見つからない場合に None (または指定されたデフォルト値) を返す get() メソッドを使用します。

print(data.get('age'))  # Outputs: None
print(data.get('age', 'Unknown'))  # Outputs: Unknown

ネストされた辞書の場合は、コレクション モジュールからのdefaultdictの使用、または dotmap や pydash などのライブラリの使用を検討してください。

from collections import defaultdict

nested_data = defaultdict(lambda: 'Unknown')
nested_data['name'] = 'Alice'
print(nested_data['age'])  # Outputs: Unknown

参考文献

  • Python KeyError とその処理方法

3. Try-Except Overuse によるサイレント エラー

問題

try-excel ブロッ​​クを過剰に使用したり誤用したりすると、例外は捕捉されても適切に処理されない、サイレント エラーが発生する可能性があります。これにより、バグの検出とデバッグが困難になる可能性があります。

try:
    result = 1 / 0
except:
    pass  # Silently ignores the error
print("Continuing execution...")

上記の例では、ZeroDivisionError が捕捉されて無視されていますが、これにより根本的な問題が隠蔽される可能性があります。

解決策

キャッチしている例外の種類を常に指定し、適切に処理してください。エラーを記録すると、問題の追跡にも役立ちます。

try:
    result = 1 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
print("Continuing execution...")

より広範な例外処理の場合、 pass:
の代わりにログを使用できます。

import logging

try:
    result = 1 / 0
except Exception as e:
    logging.error(f"Unexpected error: {e}")

参考文献

  • Python の Try-Except ベスト プラクティス

4. 整数の除算: 切り捨ての罠

問題

Python 3 より前では、2 つの整数の除算はデフォルトで下限除算を実行し、結果を整数に切り捨てていました。 Python 3 では真の除算 (/) でこの問題を解決しましたが、一部の開発者は意図せずフロア除算 (//) を使用すると依然として問題に直面しています。

print(5 / 2)  # Outputs: 2.5 in Python 3, but would be 2 in Python 2
print(5 // 2)  # Outputs: 2

解決策

特にフロア分割が必要でない限り、分割には常に / を使用します。コードを Python 2 から Python 3 に移植するときは注意してください。

print(5 / 2)  # Outputs: 2.5
print(5 // 2)  # Outputs: 2

明確で予測可能なコードを得るには、特に金融計算など、より正確な算術演算のために decimal.Decimal の使用を検討してください。

from decimal import Decimal

print(Decimal('5') / Decimal('2'))  # Outputs: 2.5

参考文献

  • Python 部門: / 対 //

5. 循環参照によるメモリ リーク

問題

Python のガベージ コレクターはほとんどのメモリ管理を処理しますが、正しく処理されないと循環参照がメモリ リークを引き起こす可能性があります。 2 つ以上のオブジェクトが相互に参照している場合、それらのオブジェクトはガベージ コレクションされない可能性があり、メモリ使用量の増加につながります。

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1  # Circular reference

del node1
del node2  # Memory not freed due to circular reference

解決策

循環参照を回避するには、weakref モジュールを介して弱い参照を使用することを検討してください。これにより、強参照が存在しない場合に参照をガベージ コレクションできるようになります。

import weakref

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)  # No circular reference now

または、オブジェクトを削除する前に参照を None に設定することで、手動でサイクルを断ち切ることもできます。

node1.next = None
node2.next = None
del node1
del node2  # Memory is freed

参考文献

  • Python のメモリ管理とガベージ コレクション

結論

2024 年になっても、Python 開発者はこれらの一般的なバグに遭遇し続けています。言語は長年にわたって進化し、改善されてきましたが、これらの問題は Python の動作方法の基本的な側面に関係していることがよくあります。これらの落とし穴を理解し、適切な解決策を適用することで、より堅牢でエラーのないコードを作成できます。コーディングを楽しんでください!


Rupesh Sharma 別名 @hackyrupesh が書いた

リリースステートメント この記事は次の場所に転載されています: https://dev.to/hackyrupesh/5-python-bugs-that-every-developer-is-still-facing-in-2024-and-how-to-fix-them-5f4p? 1 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3