Функция Readline в классе Directory Lister - PullRequest
2 голосов
/ 15 декабря 2011

Приведенный ниже класс представляет собой обходчик каталога, генерирующий динамические атрибуты, от Anurag.

import os

class DirLister(object):
    def __init__(self, root):
        self.root = root
        self._list = None

    def __getattr__(self, name):
        try:
            var = super(DirLister).__getattr__(self, name)
            return var
        except AttributeError:
            return DirLister(os.path.join(self.root, name))

    def __str__(self):
        self._load()
        return str(self._list)

    def _load(self):
        """
        load once when needed
        """
        if self._list is not None:
            return
        self._list = os.listdir(self.root) # list root someway

root = DirLister("/")
print root.etc.apache

Есть ли способ добавить другие сложные функции в DirLister от Anurag выше? Поэтому, когда он попадает в файл с именем testdir / j / p, он печатает первую строку файла p.

[IN] print testdir.j.p
[OUT] First Line of p

Я создал класс для печати первой строки файла:

class File:
    def __init__(self, path):
        """Read the first line in desired path"""
        self.path = path
        f = open(path, 'r')
        self.first_line = f.readline()
        f.close()

    def __repr__(self):
        """Display the first line"""
        return self.first_line

Просто нужно знать, как включить его в класс ниже. Спасибо.

1 Ответ

2 голосов
/ 15 декабря 2011

Вы сможете выполнить это, проверив, является ли self.root файлом или каталогом в _load(). Прочтите первую строку, если это файл, и введите os.listdir(), если это каталог. Попробуйте следующее:

import os

class DirLister(object):
    def __init__(self, root):
        self.root = root
        self._data = None

    def __getattr__(self, name):
        try:
            var = super(DirLister).__getattr__(self, name)
            return var
        except AttributeError:
            return DirLister(os.path.join(self.root, name))

    def __str__(self):
        self._load()
        return str(self._data)

    def _load(self):
        """
        load once when needed
        """
        if self._data is not None:
            return
        if os.path.isfile(self.root):
            f = File(self.data)
            self._data = f.first_line
        else:
            self._data = os.listdir(self.root) # list root someway

Я использовал ваш File класс, но вы могли бы просто поместить код для получения первой строки в _load() вместо отдельного класса для этого. Обратите внимание, что я также переименовал _list в _data, так как он больше не всегда будет представлять список файлов.

...