Pythonで禁じられている使いかた【基本ですから忘れないで!!】

まとめ

忘れては嫌ですよね!!

本稿はメモから始まる備忘録です!!
Python書式で忘れては嫌ですよね!!ってルールを残します。

変数名での禁則

Pythonでは分かり易い効率的なプログラムを作成する為に
守っていることがいくつかあります!!
うっかり忘れない様に頭の奥に叩き込んで下さい!!

関数と同じ名前は駄目

プログラマーとPCの対話を想定して下さい。
プログラマーがPCに与えた情報が命令コマンドなのか、
指示パラメタ−なのかPCが理解し難い情報は駄目です。

変数名として、不可解な情報は無意味です!!

数字で始まる変数名は駄目

PCの中でどんな作業が行われてるか想像して下さい。
映画の「マトリックス」みたいな世界で
バイナリーのデータが超高速で処理されていきます。

そうした処理を始める指示を「受ける」ための条件の一つが、
数字で始まる変数名は駄目、というルールです。

パソコンに優しいルールだと考えて遵守しましょう!!

インデントを揃えなければいけません

Pythonでは、インデント(字下げ)がコードブロックを示すために使用されます。
正確なインデントは、プログラムの構造を理解する上で非常に重要です。
通常、同じブロック内のコードは同じレベルのインデントで揃えられます。

例えば、条件文やループなどのブロックは、コロン(:)で終わり、
その後の行から始まるコードは、前の行のコロンよりも
インデントが深い位置になります。以下は、条件文(if文)の例です:

if 条件:
# 条件が真の場合の処理
    処理1

    処理2

else:
# 条件が偽の場合の処理

    処理3
    処理4

ここで重要なのは、
インデントの深さがブロックの始まりと終わりを示すことです。

同じ深さのインデントが一つのブロックを形成し、
その中のコードは同じブロックに属します。

正確なインデントを守ることで、Pythonのコンパイラがコードを正しく解釈し、
実行できるようになります。
不適切なインデントはエラーを引き起こす可能性があります。

実行速度を求めてはいけません

実行速度を求めないというのは、通常、プログラムの最適化において
「プレマチュア最適化は諸悪の根源である」
という原則に基づくアドバイスです。

この原則は、
プログラムの開発初期段階に考えましょう。

まだ十分に機能が実装されておらず、
コードの構造や設計が確立されていない段階で、
わざわざ実行速度を重視しないで下さい。

可読性や保守性などの別側面を大事にして。

このアプローチのメリットは、以下の点にあります。

可読性の向上:

コードがわかりやすくなることで、他の開発者や将来の自分が理解しやすくなります。

保守性の向上:

簡潔で理解しやすいコードは、将来の変更や修正がしやすくなります。

バグの発見と修正:

無駄に最適化することが原因で、バグが生じやすくなることがあります。
最適化は複雑さを増すため、バグの発見が難しくなります。

開発効率の向上:

最初から高度な最適化を追求することは、
プロジェクトの進捗を遅らせる可能性があります。

ただし、一般的な原則として「実行速度を無視する」
というわけではありません。

特に、プログラムが動作する範囲や要件がクリアできてから、
プロファイリングを行いボトルネックを見つけ、
必要な場合に最適化を行うことは良いアプローチです。

要件が明確になり、プログラムが予想以上に遅い場合には、
効果的な最適化手法を検討することが重要です。

“`html

Pythonで禁止(forbid)を実現する方法に関するQ&A

Pythonで特定の入力や操作を禁止したい場合、どのような方法を使えばよいのでしょうか。入力チェック、許可リスト、禁止パターンの検出、例外処理など、目的に応じた実装方法を理解することが大切です。ここでは、Pythonで安全性と可読性を両立させるためのポイントをQ&A形式で解説します。

Q1. Pythonに「forbid」という予約語はありますか?

A. Pythonには、Javaなどの言語にあるような「forbid」という予約語はありません。Pythonで禁止・拒否を実現する場合は、条件分岐、例外処理、入力バリデーション、アクセス制御などを組み合わせます。なお、ライブラリによっては設定値やオプション名として「forbid」が使われることがありますが、それはPython言語自体の予約語とは異なります。

Q2. Pythonで特定の入力を禁止するには、どうすればよいですか?

A. まずは条件分岐で入力値を確認し、禁止する条件に該当した場合に処理を中断します。例えば、特定の文字列を受け付けない場合は、入力値を比較してエラーを返す方法があります。入力値が想定外の場合に例外を発生させる設計にすると、呼び出し元でも適切にエラーを処理できます。

Q3. ブラックリストとホワイトリストは、どちらを使うべきですか?

A. セキュリティ上の制限では、原則としてホワイトリスト方式が有力です。ブラックリスト方式は、禁止する文字列やパターンを列挙しますが、想定していない表記や別の入力経路を見落とす可能性があります。一方、ホワイトリスト方式では、許可する文字や形式を明確に定義できます。用途に応じて、許可する入力を限定する設計を検討しましょう。

Q4. 正規表現を使えば、危険な入力をすべて禁止できますか?

A. いいえ。正規表現は入力形式の確認や特定パターンの検出に役立ちますが、あらゆる危険な入力を判定できるわけではありません。入力値の意味、利用するシステム、処理の文脈によって危険性は変わります。正規表現だけに依存せず、型チェック、許可リスト、適切なライブラリ、実行環境側の制御なども組み合わせる必要があります。

Q5. Pythonで禁止条件に該当した場合、どのようにエラーを返せばよいですか?

A. 禁止条件に該当した場合は、例外を発生させる方法が一般的です。例えば、入力値が不正であれば ValueError を発生させることで、呼び出し元に異常を伝えられます。独自の例外クラスを定義すれば、アプリケーション固有のエラーを区別することもできます。エラーメッセージには、秘密情報や内部構造を不用意に含めないよう注意しましょう。

Q6. ファイル操作で禁止すべき入力には、どのようなものがありますか?

A. ファイルパスをユーザーから受け取る場合、意図しないディレクトリへのアクセスや、ディレクトリトラバーサルにつながる入力に注意が必要です。単純に「../」という文字列を禁止するだけでは不十分な場合があります。pathlib などを使ってパスを正規化し、許可したディレクトリ配下に収まっているかを確認する設計が重要です。ファイルへのアクセス権限も併せて設定しましょう。

Q7. Webアプリケーションで入力を禁止する場合、Python側だけで対策できますか?

A. Python側の入力検証は重要ですが、それだけで十分とは限りません。Webアプリケーションでは、フレームワークが提供するバリデーション機能、認証・認可、データベースへの安全な問い合わせ、ファイルアップロードの制限などを組み合わせます。クライアント側の入力チェックは利便性のために使い、最終的な検証はサーバー側で行いましょう。

Q8. Pydanticの「extra=’forbid’」は、Pythonのforbidと同じものですか?

A. いいえ。Pydanticの extra='forbid' は、モデル定義に存在しない余分なフィールドを拒否するための設定です。Python言語に組み込まれた予約語ではなく、Pydanticが提供する機能です。APIで想定外の項目を受け付けたくない場合などに役立ちますが、入力データ全体の安全性を保証するものではありません。

Q9. 禁止する文字列や操作をコードに直接書いてもよいですか?

A. 小規模な処理では、条件をコードに直接記述する方法でも問題ありません。ただし、禁止条件が増える場合は、設定値や定数としてまとめると管理しやすくなります。複数の箇所で同じ制約を使う場合には、共通の検証関数を用意することも有効です。制約の変更時に、修正漏れが起きない構造を意識しましょう。

Q10. Pythonで禁止・拒否の処理を実装した後、何をテストすべきですか?

A. 正常な入力だけでなく、禁止条件に該当する入力、空文字、境界値、想定外の型、特殊文字などもテストします。ホワイトリスト方式では、許可される値と拒否される値の両方を確認することが重要です。Webアプリケーションやファイル操作では、別の経路から制限を回避できないかも検証しましょう。テストを自動化すれば、仕様変更による制約の抜け漏れを発見しやすくなります。

まとめ:禁止条件を明確にし、安全な処理を設計する

Pythonで特定の入力や操作を禁止する場合、単に危険そうな文字列を列挙するだけでは十分ではありません。何を許可し、何を拒否するのかを明確にし、入力検証、例外処理、アクセス制御、テストを組み合わせることが重要です。

「禁止する条件」をコードに落とし込むだけでなく、その制約を回避できない仕組みを設計する。 これが、安全で保守しやすいPythonプログラムを作るための基本です。

“`

〆最後に〆

以上、間違い・ご意見は
次のアドレスまでお願いします。
最近は全て返信出来てませんが
適時、返信して改定をします。

nowkouji226@gmail.com

【全体の纏め記事へ】

【雑記の纏め記事に戻る】

【Pythonをテックジムで学ぼう】

【Python学習での諸情報】

 

タイトルとURLをコピーしました