2020年1月1日水曜日

開発環境

あっきーさんのQiitPython中級者への道しるべという記事Nagata Yamatoさんの投稿について、辞書以外で以外でクラスを使うなら、collectionsモジュールのnamedtupleを使う方が簡単な場合もあるのではないかなぁと思って書いてみた。

コード

#!/usr/bin/env python3
from collections import namedtuple

User = namedtuple('User', ['name', 'age', 'sex'])
user = User('pythonista', 20, 'male')

print("My name is {} and {} years old. I'm {}.".format(*user))
# python 3.6以降
print(f"My name is {user.name} and {user.age} years old. I'm {user.sex}.")


# それでもクラスを使う場合
class UserClass:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):
        return f"My name is {self.name} and {self.age} years old. I'm {self.sex}."


user = UserClass('pythonista', 20, 'male')
print(user)

入出力結果(Zsh、PowerShell、Terminal、Jupyter(IPython))

% ./sample.py
My name is pythonista and 20 years old. I'm male.
My name is pythonista and 20 years old. I'm male.
My name is pythonista and 20 years old. I'm male.
%

一応namedtuple以外の部分について。一つ目の出力のformatについて、namedtupleを「*」でunpack。tupleだから順番は保存されているから問題なし。

2つ目の出力については、バージョン3.6以降に使えるようになったf-stringで文字列中に変数を直接埋め込んだ。キーワード引数みたいにより明示的に何を連結、文字列中に埋め込むかを指定したい場合。

3つ目は、それでもクラスを使うなら、せっかくなら__str__メソッドを上書きして出力する文字列をそこで指定してしまいたいなぁと思って。他の表示方法をしたい場合は、この場合のみのメソッドを定義するという選択肢も。

0 コメント:

コメントを投稿