pitone `getattr` come funzione che accetta stringa punteggiato

voti
1

Vorrei implementare una funzione che è simile a getattrma accetta una stringa tratteggiata ed attraversare attraverso ogni attributi.

def getattr_multiple_level(obj, attr_string):
    attr_names = attr_string.split('.')
    next_level = obj
    for attr_name in attr_names:
        next_level = getattr(next_level, attr_name)
    return next_level

class Test():
    def make_name(self, pre, suffix=):
        return str(pre) + _my_office_ + suffix


p = Test()
p.room = Test()
p.room.office = Test()

attr = getattr_multiple_level(p, 'room.office.make_name')

C'è già un modo incorporato per fare questo? O quali miglioramenti possono essere fatti in codice precedente per gestire tutti i possibili eccezioni e casi limite?

È pubblicato 24/07/2016 alle 22:03
dall'utente
In altre lingue...                            


1 risposte

voti
0

Sì, c'è "via build-in". È possibile utilizzare decoratore di proprietà. https://docs.python.org/2/library/functions.html#property

class Author(object):

    def __init__(self, full_name):
        self.full_name = full_name


class Book(object):

    def __init__(self, name):
        self.name = name

    @property
    def author(self):
        return Author("Philip Kindred Dick")

class Library(object):

    @property
    def book_ubik(self):
        return Book("ubik")


library = Library()

print(library.book_ubik.name)
print(library.book_ubik.author.full_name)

Risultato:

[email protected]:~/tmp$ python3 propery_test.py 
ubik
Philip Kindred Dick
Risposto il 24/07/2016 a 22:56
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more