Mam 5 obiektów, mac5_le(), mac4_le i tak dalej. Próbuję wyodrębnić pewną wartość z każdego z obiektów w następujący sposób,

for i in range(5,-1,-1):
     m = locals()['self.mac'+str(i)+'_le.text()']
     print m

Dostaję błąd jako KeyError: 'self.mac5_le.text()'.

Dowolny pomysł?

2
manz 8 sierpień 2012, 14:27

3 odpowiedzi

Najlepsza odpowiedź

Co do czego?

m = getattr(self, 'mac%d_le' % i).text()
3
Ignacio Vazquez-Abrams 8 sierpień 2012, 10:45

Nie jestem pewien, dlaczego chciałbyś zabawić obiekty w ten sposób, ale zdecydowanie otrzymałeś błąd składni:

locals()['self.mac'+str(i)+'_le'].text()

Powinno działać".

3
Tim Pietzcker 8 sierpień 2012, 10:41

Widzę kilka błędów z tym, co próbujesz. Najpierw zmienne self.name nie są lokalnym zakresem. Są częścią instancji lub części klasy. Miejscowi są zmiennymi, które są dostępne z bieżącego zakresu funkcji, ale nie globalny zakres. Na przykład, w poniższym kodzie, zobaczysz foo i bar, ale nie baz:

baz = 1

def silly():
    # These two variables are local
    foo = 2
    bar = 3
    print locals()

Dzwonienie silly():

>>> silly()
{'foo': 2, 'bar': 3}

Po drugie, słowniki locals() i globals() nie rozwiążą operatora Dot, ani nie będą dzwonić funkcji.

To, co chcesz zrobić, jest używać czegoś takiego jak getattr lub utwórz API, które działa lepiej dla Ciebie (kod, który próbujesz pisać, nie jest bardzo idiomatyczny python). Oto, jak może wyglądać jak getattr:

for i in range(5,-1,-1):
    m = getattr(self, 'mac'+str(i)+'_le').text()
    print m

getattr Czy zrobi wszystkie właściwe wyszukiwanie pod maską, aby znaleźć macN_le. Gdy masz odniesienie do obiektu, możesz zadzwonić na nim .text().

Mam nadzieję, że to pomoże!

0
John Szakmeister 8 sierpień 2012, 10:47