※当サイトの記事には、広告・プロモーションが含まれます。

Pythonのアンパックって何なの。Unpacking Generalizationsも謎なんだが...

gigazine.net

Microsoftは2024年8月14日に、セキュリティ更新プログラムやバグ修正が配信されるWindows Updateを行いました。このアップデートによりWindowsLinuxの両方を実行するように構成されたデバイスが起動できなくなっていることが報告されています。

WindowsのアップデートによりLinuxとのデュアルブートが不可能になったとの報告 - GIGAZINE

2024年8月14日に配信されたWindows Updateでは、セキュアブートメカニズムが回避される可能性のある脆弱(ぜいじゃく)性「CVE-2022-2601」に対して修正パッチが当てられました。

WindowsのアップデートによりLinuxとのデュアルブートが不可能になったとの報告 - GIGAZINE

Microsoftはこのパッチについて「このセキュリティの問題に対処するために、セキュアブートアドバンストターゲティング(SBAT)アップデートを適用してWindowsセキュリティに影響を与える可能性のある脆弱なLinuxブートローダーをブロックします。なお、SBATアップデートはWindowsLinuxの両方を起動するデュアルブートシステムには適用されず、これらのシステムに影響を与えることはありません」と説明していました。

WindowsのアップデートによりLinuxとのデュアルブートが不可能になったとの報告 - GIGAZINE

⇧ 相も変わらず「Windows Update」は問題を引き起こしてくれていますな。

まぁ、「デュアルブート」するような構成にしていない人には関係ない話ではありますが...

ちなみに、「デュアルブート」はというと、

マルチブートとは、1台のコンピュータに接続された複数台のディスク(パーティション)の中に複数のオペレーティングシステム(OS)をインストールし、どれかを選んでブートする事が出来るという状態のことである。

マルチブート - Wikipedia

2つの場合をデュアルブート、3つをトリプルブート...等の語もある。

マルチブート - Wikipedia

⇧「マルチブート」の「OS(Operation System)」が2つの時のことを言うそうな。

イメージとしては、

linuxsimply.com

⇧ 上図のような感じで、物理マシンに「OS(Operation System)」を追加する感じっぽいですな。

VirtualBox」や「WSL 2(Windows Subsystem for Linux 2)」のような「仮想ソフトウェア」を経由しないで利用できる「OS(Operation System)」を増やす感じなんですかね。

Pythonのアンパックって何なの。Unpacking Generalizationsも謎なんだが...

Pythonのドキュメントを確認していて、

docs.python.org

4.8.5. 引数リストのアンパック

引数がすでにリストやタプルになっていて、個別な位置引数を要求する関数呼び出しに渡すためにアンパックする必要がある場合には、逆の状況が起こります。例えば、組み込み関数 range() は引数 start と stop を別に与える必要があります。個別に引数を与えることができない場合、関数呼び出しを * 演算子を使って書き、リストやタプルから引数をアンパックします:

https://docs.python.org/ja/3/tutorial/controlflow.html#tut-unpacking-arguments

同じやりかたで、** オペレータを使って辞書でもキーワード引数を渡すことができます:

https://docs.python.org/ja/3/tutorial/controlflow.html#tut-unpacking-arguments

⇧ 唐突に何の説明も無く「アンパック」という用語が出てくるのも意味が分からないのですが、

が何なのかについても何の説明も無いのが辛過ぎるんだが...

Pythonの公式のドキュメントのサンプルの実行結果などから推測するに、「アンパック」に指定できる型としては、

  • * 演算子
    • 変更可能なシーケンス型 (mutable sequence)のリスト型 (list)の全ての要素
    • 変更不能なシーケンス (immutable sequence)のタプル型 (tuple)の全ての要素
  • ** 演算子

のようになるようですと。

Pythonの型については、

docs.python.org

Python における オブジェクト (object) とは、データを抽象的に表したものです。Python プログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。(ある意味では、プログラムコードもまたオブジェクトとして表されます。これはフォン・ノイマン: Von Neumann の "プログラム記憶方式コンピュータ: stored program computer" のモデルに適合します。)

https://docs.python.org/ja/3/reference/datamodel.html

すべてのオブジェクトは、同一性 (identity)、型、値をもっています。

https://docs.python.org/ja/3/reference/datamodel.html

オブジェクトによっては  を変更することが可能です。

https://docs.python.org/ja/3/reference/datamodel.html

値を変更できるオブジェクトのことを mutable と呼びます。

https://docs.python.org/ja/3/reference/datamodel.html

生成後に値を変更できないオブジェクトのことを immutable と呼びます。

https://docs.python.org/ja/3/reference/datamodel.html

(mutable なオブジェクトへの参照を格納している immutableなコンテナオブジェクトの値は、その格納しているオブジェクトの値が変化した時に変化しますが、コンテナがどのオブジェクトを格納しているのかが変化しないのであれば immutable だと考えることができます。したがって、immutable かどうかは値が変更可能かどうかと完全に一致するわけではありません) 

https://docs.python.org/ja/3/reference/datamodel.html

オブジェクトが mutable かどうかはその型によって決まります。例えば、数値型、文字列型とタプル型のインスタンスは immutable で、dict や list は mutable です。

https://docs.python.org/ja/3/reference/datamodel.html

⇧ 公式のドキュメントを参考にしていますが、

stackoverflow.com

⇧ 上図のような分類図が欲しいところですな。

話が脱線しましたが、「* 演算子」や「** 演算子」については、普通に考えたら、

note.nkmk.me

⇧ 上記サイト様にありますように、

「算術演算子」としての役割しかないと思ってしまうよね...

ちなみに、Python公式のドキュメントの「演算子」の説明でも、

docs.python.org

6.17. 演算子の優先順位

以下の表は Python における演算子の優先順位を要約したものです。優先順位の最も高い (結合が最も強い) ものから最も低い (結合が最も弱い) ものに並べてあります。同じボックス内の演算子の優先順位は同じです。構文が明示的に示されていないものは二項演算子です。同じボックス内の演算子は、左から右へとグループ化されます (例外として、べき乗および条件式は右から左にグループ化されます)。

https://docs.python.org/ja/3/reference/expressions.html

⇧「* 演算子」や「** 演算子」は出てくるものの、各々の「算術演算子」についての説明に止まっており、「アンパック」で利用される演算子としての説明が出て来ないんよね...

「PEP 448 – Additional Unpacking Generalizations」で、

peps.python.org

This PEP proposes extended usages of the * iterable unpacking operator and ** dictionary unpacking operators to allow unpacking in more positions, an arbitrary number of times, and in function calls and displays.

https://peps.python.org/pep-0448/

⇧ 上記の概要によると、

  • * iterable unpacking operator
  • ** dictionary unpacking operators

とあり、

Specification

Function calls may accept an unbounded number of * and ** unpackings. There will be no restriction of the order of positional arguments with relation to * unpackings nor any restriction of the order of keyword arguments with relation to ** unpackings.

https://peps.python.org/pep-0448/

⇧ とあるのだけど、そもそも、「Unpacking Generalizations」が何なのか説明して欲しいんだけど...

「Additional Unpacking Generalizations」というからには、「Unpacking Generalizations」に追加するってことだとは思うんだけど、元の仕様が分からないのに、追加の仕様の説明されても困りますな...

「unpacking」については、

note.com

要は、Listやdict型のデータを展開して(unpack)取得できる、ということである。

【Python】**二重アスタリスク〜初学者に向けて〜|▶️なんとか生きてる

⇧ 上記サイト様によりますと、「展開」という意味合いで考えれば良いらしい。

なるほど、改めて、Pythonは公式のドキュメントが酷いことが分かりましたな...

Pythonのドキュメントの説明がカオス過ぎて、ちょっと付いていけない...

不毛な調査で無駄になった貴重な時間を返して欲しいですな...

結局、

は、どう呼称すれば良いのか分からんではないか...

アスタリスク演算子」とか「ダブルアスタリスク演算子」とでも呼べば良いんですかね?

毎度モヤモヤ感が半端ない…

今回はこのへんで。