Python における識別子の理解

PythonBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Python における識別子(identifier)について包括的に理解を深めます。Python コード内で変数、関数、クラス、その他のオブジェクトに名前を付ける際の基本的なルールを学びます。

実践的な演習を通して、有効な識別子名と無効な識別子名を識別し、命名規則を強化します。この実験では、Python で使用される特別な識別子の慣習についても取り上げ、明確で読みやすく、保守性の高いコードを書くための知識を習得します。

識別子の命名規則を学ぶ

このステップでは、Python における識別子の命名規則について学びます。識別子とは、プログラム内で変数、関数、クラス、モジュールなどのオブジェクトを特定するために使用される名前です。読みやすく保守性の高いコードを書くためには、命名規則を理解することが不可欠です。

はじめに述べたように、Python の識別子は以下の規則に従う必要があります。

  • 識別子は、文字(a-z、A-Z)、数字(0-9)、およびアンダースコア(_)で構成できます。
  • 識別子の最初の文字は数字にすることはできません。
  • 識別子にはスペースや、@%$*などの特殊文字を含めることはできません。
  • 識別子はケースセンシティブです。myVariablemyvariableは異なる識別子として扱われます。
  • Python のキーワードや組み込み関数名を識別子として使用することはできません。

いくつかの識別子を定義する練習のために、簡単な Python ファイルを作成しましょう。

Terminal -> New Terminal をクリックして、WebIDE の統合ターミナルを開きます。~/project ディレクトリにいることを確認してください。

次に、VS Code エディタを使用して、~/project ディレクトリに identifier_rules.py という名前の新しい Python ファイルを作成します。これは、左側のファイルエクスプローラーペインで右クリックして New File を選択するか、コマンドパレット(Ctrl+Shift+P または Cmd+Shift+P)を使用して File: New File と入力することで行うことができます。ファイル名を identifier_rules.py とします。

identifier_rules.py ファイルに、以下のコードを入力します。

## これは有効な識別子です
my_variable = 10

## これも有効な識別子です
anotherVariable = "Hello"

## これはアンダースコアで始まる有効な識別子です
_private_variable = True

## これは無効な識別子です(数字で始まっている)
## 1st_variable = 5

## これは無効な識別子です(スペースを含んでいる)
## my variable = "invalid"

## これは無効な識別子です(特殊文字を含んでいる)
## my-variable = 20

## これは無効な識別子です(キーワードを使用している)
## if = 30

print(my_variable)
print(anotherVariable)
print(_private_variable)

ファイルを保存するには、Ctrl+S(またはCmd+S)を押します。

次に、ターミナルからこの Python スクリプトを実行して、出力を確認しましょう。ターミナルで、~/project ディレクトリにいることを確認し、次のコマンドを実行します。

python identifier_rules.py

print ステートメントの出力が表示され、有効な識別子が正しく処理されたことが確認できるはずです。無効な識別子が含まれる行はコメントアウトされているため、スクリプト実行時にエラーは発生しません。

10
Hello
True

この演習は、Python で有効な識別子を作成するための基本的なルールを示しています。次のステップでは、有効な識別子と無効な識別子、および一般的な命名規則についてさらに詳しく見ていきます。

有効な識別子名の練習

このステップでは、前のステップで学んだ規則に基づいて、Python で有効な識別子名を作成する練習を行います。変数、関数、その他のコード要素に意味のある有効な名前を選択することは、良いコードを書くための基本的な部分です。

VS Code エディタを使用して、~/project ディレクトリに valid_identifiers.py という名前の新しい Python ファイルを作成しましょう。

valid_identifiers.py ファイルに、以下のコードを入力します。このコードは、有効な識別子名を使用していくつかの変数を定義し、それらの値を表示します。

## 有効な変数名
user_age = 30
total_count = 100
item_price_usd = 25.50
is_active = True
_internal_value = "secret"
MAX_RETRIES = 5

## 有効な関数名(関数については後ほど学びます)
def calculate_total():
    return user_age * total_count

## 有効なクラス名(クラスについては後ほど学びます)
class UserProfile:
    def __init__(self, name):
        self.name = name

## 変数の値を表示
print("User Age:", user_age)
print("Total Count:", total_count)
print("Item Price (USD):", item_price_usd)
print("Is Active:", is_active)
print("Internal Value:", _internal_value)
print("Maximum Retries:", MAX_RETRIES)

## 関数を呼び出して結果を表示
## print("Calculated Total:", calculate_total())

## クラスのインスタンスを作成してプロパティを表示
## user = UserProfile("Alice")
## print("User Name:", user.name)

ファイルを保存するには、Ctrl+S(またはCmd+S)を押します。

次に、ターミナルからこの Python スクリプトを実行しましょう。~/project ディレクトリにいることを確認し、次のコマンドを実行します。

python valid_identifiers.py

コンソールに変数の値が表示されるはずです。

User Age: 30
Total Count: 100
Item Price (USD): 25.5
Is Active: True
Internal Value: secret
Maximum Retries: 5

変数名が単語を区切るためにアンダースコア(_)を使用していることに注目してください。これは、Python で変数名や関数名によく使われる慣習です(snake_case)。UserProfile のようなクラス名は、通常、各単語の最初の文字を大文字にします(PascalCase)。MAX_RETRIES のような定数は、すべて大文字でアンダースコアを使用して記述されることがよくあります。

これらの例で練習することで、Python で有効で読みやすい識別子名を作成することに慣れることができます。

無効な識別子名を特定する

このステップでは、Python で無効な識別子名を特定することに焦点を当てます。有効な名前の規則を知ることと同じくらい、識別子を無効にするものを理解することは重要です。無効な識別子を使用しようとすると、Python コードを実行しようとしたときにSyntaxErrorが発生します。

VS Code エディタを使用して、~/project ディレクトリに invalid_identifiers.py という名前の新しい Python ファイルを作成しましょう。

invalid_identifiers.py ファイルに、以下のコードを入力します。このコードには、無効な識別子名の例が含まれています。これらが生成するエラーを確認するために、意図的に含めます。

## 無効な識別子:数字で始まっている
## 1variable = 10

## 無効な識別子:スペースを含んでいる
## my variable = "hello"

## 無効な識別子:特殊文字(@)を含んでいる
## user@name = "Alice"

## 無効な識別子:特殊文字(-)を含んでいる
## product-id = "XYZ123"

## 無効な識別子:Python のキーワードを使用している
## class = "Math"

## 無効な識別子:別の Python キーワードを使用している
## for = 100

## 無効な識別子:特殊文字($)を含んでいる
## total$amount = 50.75

## 無効な識別子:特殊文字(%)を含んでいる
## discount%rate = 0.15

print("無効な識別子を定義しようとすると SyntaxError が発生します。")

ファイルを保存するには、Ctrl+S(またはCmd+S)を押します。

次に、ターミナルからこの Python スクリプトを実行してみましょう。~/project ディレクトリにいることを確認し、次のコマンドを実行します。

python invalid_identifiers.py

すべての無効な識別子はコメントアウトされているため、スクリプトはエラーなしで実行され、メッセージが表示されます。

Attempting to define invalid identifiers will cause a SyntaxError.

ここで、無効な識別子のいずれかのコメントを解除して、エラーを確認してみましょう。## 1variable = 10 の行の先頭にある # を削除します。行は 1variable = 10 となるはずです。

ファイルを再度保存します。

再度スクリプトを実行します。

python invalid_identifiers.py

今回は、識別子が数字で始まっているため無効であることを示す SyntaxError が表示されるはずです。

  File "/home/labex/project/invalid_identifiers.py", line 4
    1variable = 10
    ^
SyntaxError: invalid decimal literal

他の無効な識別子を一つずつコメント解除してスクリプトを実行し、それらが生成するさまざまな種類の SyntaxError メッセージを確認することができます。エラーを特定するために、次のものをコメント解除する前に、前の無効な識別子をコメントアウトすることを忘れないでください。

このステップは、識別子に名前を付ける際の一般的な間違いを認識し、構文エラーを回避するために命名規則に従うことの重要性を理解するのに役立ちます。

特殊識別子の規約を理解する

このステップでは、Python の識別子でアンダースコアを使用するいくつかの特別な慣習を探ります。これらの慣習は、基本的な規則に従って識別子が有効か無効かに必ずしも影響しませんが、識別子の意図された使用法や可視性について特定の意味を伝えます。

一般的なアンダースコアの慣習は以下の通りです。

  • 単一の先頭アンダースコア (_name): この慣習は、識別子がモジュールまたはクラス内の内部使用を意図していることを示します。これは、他のプログラマーに対して、モジュールまたはクラスの外部からこの識別子に直接アクセスすべきではないというヒントです。ただし、Python はこれを厳密に強制しません。選択すれば、依然としてアクセスできます。
  • 二重の先頭アンダースコア (__name): この慣習は、クラスでの名前マングリングに使用されます。クラス内の識別子が 2 つのアンダースコアで始まり(そして 2 つのアンダースコアで終わらない)場合、Python は内部的に名前を変更して、クラスの外部から直接アクセスしにくくします。これは、継承における名前の衝突を防ぐのに役立ちます。
  • 二重の先頭および末尾アンダースコア (__name__): これらの識別子は、Python インタプリタによる特別な用途のために予約されています。例としては、__init__(コンストラクタ)、__str__(文字列表現)などがあります。Python の特別なメソッドのいずれかを実装している場合を除き、このパターンを持つ独自の識別子を作成することは避けるべきです。
  • 単一の末尾アンダースコア (name_): この慣習は、Python のキーワードとの名前の衝突を避けるために使用されます。Python のキーワード(classfor など)である名前を使用したい場合は、アンダースコアを追加して有効な識別子にすることができます(例:class_for_)。

これらの慣習を実際に確認するために、VS Code エディタを使用して~/project ディレクトリに underscore_conventions.py という名前の新しい Python ファイルを作成しましょう。

underscore_conventions.py ファイルに、以下のコードを入力します。

## 単一の先頭アンダースコア:内部使用を意図
_internal_data = "This is internal data"

## 二重の先頭アンダースコア:クラスでの名前マングリング
class MyClass:
    def __init__(self):
        self.__private_attribute = "This is a private attribute"

    def get_private_attribute(self):
        return self.__private_attribute

## 二重の先頭および末尾アンダースコア:特別なメソッド
class MyString:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"MyString object with value: {self.value}"

## 単一の末尾アンダースコア:キーワードの衝突を避けるため
import builtins
class_ = "This variable name avoids conflict with the 'class' keyword"

print("Internal data:", _internal_data)

## プライベート属性へのアクセス(名前マングリングのデモンストレーション)
obj = MyClass()
## print(obj.__private_attribute) ## これは AttributeError を引き起こします
print("Accessing private attribute via method:", obj.get_private_attribute())
## マングリングされた名前を使用して技術的にはアクセスできますが、推奨されません
## print("Accessing mangled name:", obj._MyClass__private_attribute)

## 特別な__str__メソッドの使用
my_str_obj = MyString("Hello World")
print(my_str_obj) ## これは__str__メソッドを呼び出します

print("Variable name avoiding keyword conflict:", class_)

ファイルを保存するには、Ctrl+S(またはCmd+S)を押します。

ターミナルからスクリプトを実行します。

python underscore_conventions.py

これらの慣習の使用を示す出力が表示されるはずです。

Internal data: This is internal data
Accessing private attribute via method: This is a private attribute
MyString object with value: Hello World
Variable name avoiding keyword conflict: This variable name avoids conflict with the 'class' keyword

obj.__private_attribute に直接アクセスしようとすると、名前マングリングのために AttributeError が発生することに注意してください。get_private_attribute メソッドまたはマングリングされた名前 _MyClass__private_attribute を介してアクセスすることは可能ですが、慣習としてはメソッドを使用します。print(my_str_obj) の呼び出しは、文字列表現の特別なメソッドであるため、自動的に __str__ メソッドを使用します。

これらの慣習を理解することは、Python コードの識別子名の背後にある意図を解釈し、一般的なプラクティスに従ったコードを書くのに役立ちます。

まとめ

この実験では、Python における識別子の命名に関する基本的な規則を学びました。数字で始めることができないという規則を遵守しながら、文字、数字、アンダースコアを使用して有効な識別子名を作成する練習をしました。また、スペース、特殊文字を含んでいたり、Python のキーワードであったりする無効な識別子名も特定しました。「プライベート」変数に先頭アンダースコアを使用するなど、特別な識別子の慣習についても探りました。