Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

目的

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のコードを書いているときに思いついたちょっとした話でした。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away