Pythonについて最近まで知らなかったこと

最近Pythonのドキュメントや書籍を読み返して、私が忘れていたことや知ったことについて書きます。Python3.4を対象にしています。

setの省略記法

{}を使うことでset型を定義できます。

>>> {1, 2}
{1, 2}

>>> type({1, 2})
<class 'set'>

注意しなければならないのは空setを得るために{}と書くと、それはdictとして扱われてしまうということです。

>>> type({})
<class 'dict'>

frozenset

通常のsetはadd()やremove()といったメソッドで、そのsetの内容を変更することができます。frozensetはそのようなメソッドを持っていないため、変更することができません。また、setは辞書のキーやsetの要素にできませんが、frozensetは辞書のキーになることも、setの要素になることもできます。

>>> {1, {2}}
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> {1, frozenset([2])}
{1, frozenset({2})}

>>> {{1}: 'dict'}
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> {frozenset([1]): 'dict'}
{frozenset({1}): 'dict'}

Exceptionはすべての例外の基底ではない

すべてのExceptionの親はBaseExceptionです。

>>> Exception.__base__
<class 'BaseException'>

しかし、ドキュメントには

ユーザ定義例外を直接このクラス から導出することは意図していません

とあるので、例外を自作するときはException以下の子を使用しましょう。 Exceptionの子になっていない例外にはSystemExitとKeyboardInterruptがあります。SystemExitはsys.exit()から、KeyboardInterruptはCtrl-cなどが入力された場合に送出されます。

Ellipsisと...

...はEllipsisの別名です。Ellipsisは省略という意味です。

>>> def f():
...     ...
...
...
>>> f()

このように書くとpassと書くよりも、記述を省略していることが分かりやすいのではないでしょうか。

コメント

2015 - 2017 (c) 成瀬基樹