Alle Variablen einer Klasse ändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
RubenRybnick
User
Beiträge: 2
Registriert: Mittwoch 26. April 2017, 13:39

Alle Variablen einer Klasse ändern

Beitragvon RubenRybnick » Montag 17. Juli 2017, 14:58

Hallo,

ich habe ein komisches Problem. Ich habe eine Klasse z.B.

  1. class parameter:
  2.   a=2
  3.   b=[1,2,3]
  4.   c=4
  5. ....
  6. usw.


im Prinzip eine Klasse voll mit Variablen, welche nur Zahlen angeben. Jedoch sind manche dieser Variablen schlecht deklariert und ich hätte sie gerne als np.array.

Gibt es eine Möglichkeit alle Einträge einer Klasse durchzugehen und diese zu ändern? Ich könnte jetzt händisch hinschreiben und wenn ich meiner Funktion die parameter Übergeben habe schreiben:

  1. def brot(parameter):
  2.  parameter.b=np.array(b)


usw.

Gibt es eine Möglichkeit für alle durchzuführen?
Zuletzt geändert von BlackJack am Montag 17. Juli 2017, 15:03, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 32710
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Alle Variablen einer Klasse ändern

Beitragvon BlackJack » Montag 17. Juli 2017, 15:16

@RubenRybnick: Das ist ja erst einmal eine komische Klasse. Warum missbrauchst Du eine Klasse für so etwas? Wenn das ein Wörterbuch wäre, hättest Du das Problem nicht.

Man könnte mit `dir()` durch die Attribute/Werte gehen und die ”magischen” rausfiltern, und mit `setattr()` die Änderungen wieder auf dem Objekt speichern.
“XML combines all the inefficiency of text-based formats with most of the unreadability of binary formats :-)” — Oren Tirosh, c.l.p, 2002
RubenRybnick
User
Beiträge: 2
Registriert: Mittwoch 26. April 2017, 13:39

Re: Alle Variablen einer Klasse ändern

Beitragvon RubenRybnick » Montag 17. Juli 2017, 18:57

Hoi,

der Code war leider schon vorhanden und ich muss mich irgendwie damit abfinden. Es sind ca 5000 Zeilen Code mit Verwendung von parameter.variable und den ganzen Code zu ändern ist mir zu Stressig. Ich könnte in der Klasse selber überall np.array davor schreiben, aber ich dachte es gibt vllt eine einfache Möglichkeit um das ganze automatisiert durchzugehen :(
nezzcarth
User
Beiträge: 364
Registriert: Samstag 16. April 2011, 12:47

Re: Alle Variablen einer Klasse ändern

Beitragvon nezzcarth » Montag 17. Juli 2017, 19:20

RubenRybnick hat geschrieben:der Code war leider schon vorhanden und ich muss mich irgendwie damit abfinden. Es sind ca 5000 Zeilen Code mit Verwendung von parameter.variable und den ganzen Code zu ändern ist mir zu Stressig. Ich könnte in der Klasse selber überall np.array davor schreiben, aber ich dachte es gibt vllt eine einfache Möglichkeit um das ganze automatisiert durchzugehen :(

Die "Klasse" zur Laufzeit (und damit bei jeder Ausführung neu!) so zurecht zu biegen, dass sie deinen Ansprüchen eher entspricht, ist meiner Meinung nach kein sinnvolles Vorgehen. Du solltest das nach Möglichkeit wirklich im Quelltext direkt abändern, auch wenn es einmalig viel Arbeit ist. Je nach Art und Umfang der Änderungen kann man das auch (semi-)automatisch machen, also z. B. mit regulären Ausdrücken in sed bzw. der Ersetzen-Funktion deines bevorzugten Editors, oder den Refactoring-Tools einer IDE wie Pycharm. Gerade die erstgenannte Variante ist natürlich nicht unkritisch, aber in solchen Fällen kann man das denke ich ausnahmsweise mal machen, wenn man vorsichtig ist.

Wenn es unbedingt sein muss, klappt es so, wie BlackJack meinte; statt dir kann man auch inspect.getmembers() zur Hilfe nehmen.
Zizibee
User
Beiträge: 141
Registriert: Donnerstag 12. April 2007, 08:36

Re: Alle Variablen einer Klasse ändern

Beitragvon Zizibee » Mittwoch 19. Juli 2017, 08:05

Ich würde für so etwas die Suche und Ersetzte Funktion vom Notepad++ benutzen. Wenn man da ein Häckchen bei Reguläre Ausdrücke setzt, kann man sich da echt austoben :)
Bei deinem Beispiel in etwa so:

Suche: =[ ]?([a-zA-Z0-9 ,\[\]\(\)]*)
Ersetze: =np.array\(\1\)
Benutzeravatar
BlackJack
Moderator
Beiträge: 32710
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Alle Variablen einer Klasse ändern

Beitragvon BlackJack » Mittwoch 19. Juli 2017, 14:47

Etwas sicherer als reguläre Ausdrücke wäre es wahrscheinlich auf dem AST von dem Quelltext zu operieren. `redbaron` ist für Python so etwas ähnliches wie BeautifulSoup für HTML:
  1. from __future__ import absolute_import, division, print_function
  2. from redbaron import RedBaron
  3. from redbaron.nodes import ListNode
  4.  
  5. SOURCE = '''
  6. class Spam:
  7.  x=[1,2,3]
  8.  
  9. class parameter:
  10.  a=2
  11.  b=[1,2,3]
  12.  c=4
  13.  d=[
  14.    42,
  15.    23,
  16.    4711,
  17.  ]
  18.  
  19. class Parrot:
  20.  y=[3,2,1]
  21. '''
  22.  
  23.  
  24. def is_list_node(node):
  25.     return isinstance(node, ListNode)
  26.  
  27.  
  28. def main():
  29.     np_array_call = RedBaron('np.array()')[0]
  30.     red = RedBaron(SOURCE)
  31.     parameter_class = red.find('class', name='parameter')
  32.     for assignment in parameter_class('assignment', value=is_list_node):
  33.         new_value = np_array_call.copy()
  34.         new_value.call.value = assignment.value
  35.         assignment.value = new_value
  36.     print(red.dumps())
  37.  
  38.  
  39. if __name__ == '__main__':
  40.     main()

Ausgabe:
  1. class Spam:
  2.   x=[1,2,3]
  3.  
  4. class parameter:
  5.   a=2
  6.   b=np.array([1,2,3])
  7.   c=4
  8.   d=np.array([
  9.     42,
  10.     23,
  11.     4711,
  12.   ])
  13.  
  14. class Parrot:
  15.   y=[3,2,1]
“XML combines all the inefficiency of text-based formats with most of the unreadability of binary formats :-)” — Oren Tirosh, c.l.p, 2002

Zurück zu „Allgemeine Fragen“

Wer ist online?

Mitglieder in diesem Forum: Yahoo [Bot]