🐥

今更人に聞けないPythonの基本の用語を、PHPと比較しながらまとめてみる。

2024/09/25に公開

始めに。

今回業務で、バックエンド側の言語としてFastAPIを使用しました。
これまでLaravelがメインだったため、
Pythonのことからよくわからず、苦戦しました。
そこで、今回は今更人に聞けないけど、
自分でまだわかっていない用語を深掘りしていきたいと思います。
これまでがPHPだったので、折角なので二つを比較しながらまとめてみようと思います。
自分がわからないのはFastAPIの用語だと思っていたけど、
ほぼほぼPythonの用語がわかっていなさそうなことがわかりました。
不勉強すぎる。

今回の基本用語達。

dict

私にはあまり馴染みがない用語だったのですが、よく出てくるワードな気がします。
戻り値の型ヒントなどで良く使うイメージですね。下記のようなメソッドでよく見ます。

 def search_and_get_users(
        self: "UserService",
        search_params: SearchParamsSchema,
        page: int,
        per_page: int,
        db: Session,
 ) -> dict:

下記サイトでは、このように説明されています。
https://utokyo-ipp.github.io/3/3-1.html

辞書は、キー (key) と値 (value) を対応づけるデータです。 キーとしては、文字列・数値・タプルなどの変更不可能なデータを使うことができますが、 変更可能なデータであるリスト・辞書を使うことはできません。 (辞書も変更可能なデータです。) 一方、値としては、変更の可否にかかわらずあらゆる種類のデータを指定できます。
実際に書くとこんな感じ。

ppap = {"apple": 3, "pen": 5}

PHPで言うと連想配列みたいなものですね。

ppap = array("apple" => 3, "pen" => 5);

ただdictの方が、不変オブジェクトをキーに使えますが、
PHPの連想配列では文字列や整数が一般的なので、
そこが結構違いますね。
なんとなくで使用していましたが、
これが使いこなせるようになるとかなり変わりそうです。
下記の記事が詳しく、書いてあるのでおすすめです。

https://qiita.com/kubochiro/items/5d5cb57ee071702d15da

list

こちらもなんとなくで使用していたワード。
複数のデータを要素としてまとめて取り扱うデータ型の一つ。
他の言語で言うと配列に相当するものです。
リストでは構成する要素としてあらゆる型のデータを指定できます。

my_list = [1, "two", 3.0, [4, 5]]

PHPだとarrayで書けます。

$my_array = array(1, "two", 3.0, array(4, 5));

(余談ですが、さっきのdictもarrayで書いていたので、
PHPの配列自体がPythonのdictとlistを兼ね備えているんですね)

Pythonでのlistは引数、戻り値どちらでもよく使われている印象です。

def filter_users(
    search_params: SearchParamsSchema,
    users: list[dict],
) -> list:

リストの各要素が辞書になるみたいな型ヒントは、
最初見慣れない時はよくわかっていなかったのですが、
usersは下記のようになります。

users = [
    {"id": 1, "name": "Alice", "age": 30},
    {"id": 2, "name": "Bob", "age": 25},
    {"id": 3, "name": "Charlie", "age": 35}
]

リストはあらゆる型のデータを指定できるってこう言うことなんですね。
後PHPだと多次元配列のようなものになりますね。

$users = [
    ["id" => 1, "name" => "Alice", "age" => 30],
    ["id" => 2, "name" => "Bob", "age" => 25],
    ["id" => 3, "name" => "Charlie", "age" => 35]
];

後、

users_list = []

のように[]でlistや配列を作成するので、
そこもPHPと似てます。
(array()より[]の方がよく使いますし)

タプル

list、dictとかと並んでよく出てくるのがこちらの用語。
(...) で要素を並べたものです。
こちらはPHPに似たような概念のものはないです。

numbers2 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

listに似ているのですが、一つだけ違うのは、
要素を変更できない点です。
元々のデータに手を入れたくない場合はタプルを使用します。
とはいえ私は今のところ実装ではタプルを使用したことがない気がします……。
ですが違いについてはちゃんと把握しておきたいです。

〇〇.append()

リストの末尾に要素を一つ追加します。

a = [1,2,3]
a.append([4,5])
print(a)

実行結果は下記のようになります。

[1, 2, 3, [4, 5]]

for文を回して、リストに要素を追加していくときとかに重宝しました。
PHPだと[]やarray_pushを使用して書くことができますね。

$a = [1, 2, 3];
$a[] = [4, 5];
print_r($a);

filterとfilter_by

SQLAlchemy ORMを使用すると、PythonでSQLを直接操作できます。
↓SQLAlchemyに関して詳しくは下記記事参照
https://qiita.com/arkuchy/items/75799665acd09520bed2
PHPにもEloquent ORMがあるので考え方は似ている気がしますね。
こちらは名前の通り、カラム内のデータをフィルタリングできるメソッドです。
filterとfilter_byは下記のように書き方に違いがあります。

session.query(MyClass).filter(MyClass.name == 'some name').first()
session.query(MyClass).filter_by(name = 'some name').first()

上記の場合だと、同じ結果が出力されます。
filter_byの方がコードが短く書けますね。
一方でfilter_byは等号でないとフィルタリングができないです。
下記のような不等号の条件も併用して使う際は、filterでないと使用できません。

session.query(MyClass).\
    filter(MyClass.name == 'some name', MyClass.id > 5).all()

今自分のコードを見てみると、
filter_byで書ける箇所を全部filterで書いていました……。
まあ最初はちゃんと丁寧に書いておいた方が良いからfilterの方が良いのかもしれません。

session.query(〇〇).options(joinedload(〇〇.〇〇))

リレーションが貼られているテーブルの情報を、事前にロードするために使用するのが、
joinedloadになります。
下記のような感じで書きます。

session.query(Order).options(
    joinedload(Order.items),
    joinedload(Item.keywords)
)

phpだとwithを使って事前ロードしていましたね。

 $this->Order
   ->with(['items', 'item.keywords'])

他にもsubqueryloadなど、SQLAlchemyにはロードの方法が色々ありそうです。
詳しくはどこかで調べられるといいなと思います。
参照記事:
https://qiita.com/nassy20/items/17a7bcd2a8342f3fb608

まとめ

本当に基礎の用語が多くて、
ほとんどの人にとってはわかっていそうな内容でしたが、
私はなんとなくで使用してしまっていたので、
まとめられてよかったと思いました。
あとわざわざPHPと比較する意味はあったのか?
と言われると、正直あんまり意味はないです。
私がPHPも忘れている気がしたので、
一緒に復習しただけになりますw
こうやって比較してみると考え方は似ているのですが、
名前が違うかったりして面白いなと感じました。
次回こそはFastAPIの用語をまとめられればと思います。
それではほぼ自分のための記事になりましたが、お読みいただきありがとうございました。
誰かの参考になれば幸いです。

参考文献

この記事は下記の記事を参考にして、書かせていただきました。
https://utokyo-ipp.github.io/3/3-1.html
https://docs.python.org/ja/3/contents.html
https://qiita.com/kubochiro/items/5d5cb57ee071702d15da
https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.filter
https://docs.sqlalchemy.org/en/20/orm/queryguide/relationships.html#sqlalchemy.orm.joinedload
https://qiita.com/nassy20/items/17a7bcd2a8342f3fb608

Arsaga Developers Blog

Discussion