Подобный JavaScript Объект в библиотеке стандарта Python?

Код из Apache Commons Lang 3.4 ( JavaDoc ):

public static String getStackTrace(final Throwable throwable) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw, true);
    throwable.printStackTrace(pw);
    return sw.getBuffer().toString();
}

Разница с другими ответами заключается в том, что он использует autoFlush в PrintWriter.

20
задан David Wolever 14 April 2010 в 21:02
поделиться

6 ответов

Нет "стандартной библиотеки" с такого рода объекты, но в ActiveState есть довольно известный рецепт от Алекса Мартелли, названный "связкой" .

Примечание: на pypi также доступен пакет под названием bunch , который должен делать примерно то же самое, но я ничего не знаю о его реализации и качестве.

7
ответ дан 30 November 2019 в 00:00
поделиться

Этот метод работает с вложенными словарями и довольно краток.

Во-первых, определите пустой класс. Экземпляры этого класса могут быть установлены любые атрибуты.

class holder:
    pass

Затем, просто использование эта функция.

def dotted(object):

    if isinstance(object, dict):
        parent = holder()

        for key in object:

            child = object.get(key)
            setattr(parent, key, dotted(child))

        return parent

    return object

использование В качестве примера.

users = dotted(
{
    'john': {
        'fullname': 'John Doe'
        'age': 24,
        'hobbies': [
            'programming',
            'jogging'
        ]
    }
}

users.john.fullname # 'John Doe'
users.john.age # 24
users.john.hobbies # ['programming', 'jogging']
0
ответ дан 30 November 2019 в 00:00
поделиться

Вы можете попробовать с attrdict :

class attrdict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self.__dict__ = self

a = attrdict(x=1, y=2)
print a.x, a.y
print a['x'], a['y']

b = attrdict()
b.x, b.y  = 1, 2
print b.x, b.y
print b['x'], b['y']
12
ответ дан 30 November 2019 в 00:00
поделиться

Я не большой поклонник этого, потому что вы попадаете в ситуацию "что, если вы определите 'keys'":

foo = DumbObject()
foo.moshe = 'here'
foo.keys # --> gives a callable, if you'll call it you'll get ['moshe']
foo.keys = 'front-door'
foo.keys # --> oh look, now it's a string 'front-door'

Предполагается ли, что "keys" - это определенный метод вашего объекта, или это просто случайность? Если да, то вам лучше определить DumbObject как

class DumbObject(object):
    def __init__(self):
        self._dict = {}
    def __getitem__(self, key):
        return self._dict[key]
    __getattr__ = __getitem__
    # Ditto for set
def asDictionary(do):
    return do._dict

Но зачем вы это делаете? Вы уверены, что это правильный ответ? Возможно, вам следует использовать правильный тип объекта?

1
ответ дан 30 November 2019 в 00:00
поделиться

Возможно, вы интересует collections. namedtuple

8
ответ дан 30 November 2019 в 00:00
поделиться

Если я правильно вас понял, вам нужен объект, в котором вы можете просто сбрасывать атрибуты. Если я прав, все, что вам нужно сделать, это создать пустой класс. Например:

>>> class DumpObject: pass
... 
>>>#example of usage:
...
>>> a = DumpObject()
>>> a.airspeed = 420
>>> print a.airspeed
420

Вот и все

6
ответ дан 30 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: