ホームページ > バックエンド開発 > Python チュートリアル > すべての開発者が依然として直面している ython のバグとその修正方法)

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

WBOY
リリース: 2024-08-31 06:00:36
オリジナル
502 人が閲覧しました

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

問題

存在しない辞書キーにアクセスしようとすると、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 の過剰使用によるサイレント エラー

問題

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...")
ログイン後にコピー

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

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
ログイン後にコピー

References

  • Python Memory Management and Garbage Collection

Conclusion

Even in 2024, Python developers continue to encounter these common bugs. While the language has evolved and improved over the years, these issues are often tied to fundamental aspects of how Python works. By understanding these pitfalls and applying the appropriate solutions, you can write more robust, error-free code. Happy coding!


Written by Rupesh Sharma AKA @hackyrupesh

以上がすべての開発者が依然として直面している ython のバグとその修正方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート