LoginSignup
1
3

More than 5 years have passed since last update.

Pythonでグローバルなリスト変数を安全に使う

Last updated at Posted at 2018-12-03

目的

Pythonでリストをだんだんappendで増やしていき
長さが一定以上になったら一気に読み出して使いたい場合に
リストのメソッドを限定し間違って消したりしないようにしたい。

想定されるミスの例

TEST = []

if __name__ == "__main__":

    # 入力
    TEST.append(["ff"])

    # 誤って挿入してしまったコード
    TEST.pop()

    # 結果表示、自分で消してるので空になる
    print(TEST)

コード自体が間違っているというより、そういう風に書いているため、
なんとも言えないですが、長いコードになるとこういうことがよくあります。

解決方法

解決方法というほどではないんですが、グローバル変数のリストを
オブジェクトで書き直してメソッドを限ってしまえば、
コードもスッキリしますし、単純なミスが防げる気がします。

class BufferedList:
    """Buffered list.

    Buffered list is queue-like object.
    Implementation for safe list operation to limit access method.
    Method:
        clear: clear list
        set: set list
        get: get list
        append: append list
        qsize: return len(list)
    """

    def __init__(self):
        """Init."""
        self.__data = []

    def clear(self):
        """Clear list."""
        self.__data = []

    def set(self, newlist):
        """Set."""
        if not isinstance(newlist, list):
            raise ValueError("Buffer only set list.")
        self.__data = newlist
        return self.__data

    def get(self):
        """Get."""
        return self.__data

    def qsize(self):
        """Return list length."""
        return len(self.__data)

    def append(self, item):
        """Append."""
        self.__data.append(item)
        return self.__data

12/4 appendメソッドの中に不要な例外処理がありました。お詫びして訂正します。

上のクラスを使用した例

TEST = BufferedList()

if __name__ == "__main__":

    # 入力
    TEST.append(["ff"])

    # 誤って挿入してしまったコード、ここでエラーになる
    TEST.pop()

    # 結果表示
    print(TEST)

速度の面は検証していませんから、もしかしたら問題があるかも知れないです。
pythonのコードを書いているときに思いついたちょっとした話でした。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3