Код из 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
.
Нет "стандартной библиотеки" с такого рода объекты, но в ActiveState есть довольно известный рецепт от Алекса Мартелли, названный "связкой" .
Примечание: на pypi также доступен пакет под названием bunch , который должен делать примерно то же самое, но я ничего не знаю о его реализации и качестве.
Этот метод работает с вложенными словарями и довольно краток.
Во-первых, определите пустой класс. Экземпляры этого класса могут быть установлены любые атрибуты.
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']
Вы можете попробовать с 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']
Я не большой поклонник этого, потому что вы попадаете в ситуацию "что, если вы определите '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
Но зачем вы это делаете? Вы уверены, что это правильный ответ? Возможно, вам следует использовать правильный тип объекта?
Если я правильно вас понял, вам нужен объект, в котором вы можете просто сбрасывать атрибуты. Если я прав, все, что вам нужно сделать, это создать пустой класс. Например:
>>> class DumpObject: pass
...
>>>#example of usage:
...
>>> a = DumpObject()
>>> a.airspeed = 420
>>> print a.airspeed
420
Вот и все