Python Methode lässt sich ohne optionales Argument nicht aufrufen

Gast #6160784
Hallo,

Es geht um folgende Methode in der Klasse smach.state_machine
1
def set_initial_state(self, initial_states, userdata=smach.UserData()): 
2
      smach.logdebug("Setting initial state to "+str(initial_states)) 
3
   
4
      if len(initial_states) > 1: 
5
          smach.logwarn("Attempting [...String fürs Forum gekürzt].") 
6
   
7
      # Set the initial state label 
8
      if len(initial_states) > 0: 
9
          self._initial_state_label = initial_states[0] 
10
      # Set local userdata 
11
      self.userdata.update(userdata)

Wenn ich diese aufrufe mit
1
set_initial_state(['History'])

Beschwert sich Python mit
1
set_initial_state() takes exactly 3 arguments (2 given)



Wenn ich das optionale Argument userdata mit übergebe d.h. stattdessen 
folgendermaßen aufrufe:
1
set_initial_state(['History'], userdata=smach.UserData())

Dann klappt's. Warum lässt mich Python das OPTIONALE Argument nicht 
weglassen?
#6160899
Der Wert von
1
smach.UserData()
wird erst zur Laufzeit feststehen und ich habe keine
Ahnung, wie Python das auswertet. Ich halte es für
tendenziell problematisch und würde das irgendwie
anders lösen, evtl so:
1
def set_initial_state(self, initial_states, userdata=None): 
2
      if userdata is None:
3
            userdata=smach.UserData()
4
      smach.logdebug("Setting initial state to "+str(initial_states))

merciless
Gast #6163546
Hannes schrieb:
> Die Methode welchen Objektes rufst du denn hier auf? Ich sehe nur
> Funktionsaufrufe.

Es ist eine Methode der Klasse smach.state_machine und sie soll aus der 
_init_ einer davon abgeleiteten Klasse heraus aufgerufen werden.

Dirk K. schrieb:
> würde das irgendwie anders lösen, evtl so:
> def set_initial_state(self, initial_states, userdata=None):
> ...

Die Methode ist Teil eines externen Moduls und soll/darf nicht geändert 
werden. Gibt auch keinen Grund dazu, sie funktioniert wunderbar.

Ich verstehe nur nicht, was an meinem Aufruf falsch ist.
Moderator #6163668
mech schrieb:
> Es ist eine Methode der Klasse smach.state_machine und sie soll aus der
> init einer davon abgeleiteten Klasse heraus aufgerufen werden.

smach.state_machine ist keine Klasse, sondern ein Modul. Davon kannst du
nichts ableiten. Die Klasse, von der du vermutlich ableiten möchtest,
liegt in diesem Modul und heißt StateMachine.
Gast #6163917
Yalu X. schrieb:
> smach.state_machine ist keine Klasse, sondern ein Modul. Davon kannst du
> nichts ableiten. Die Klasse, von der du vermutlich ableiten möchtest,
> liegt in diesem Modul und heißt StateMachine.

Korrekt, danke, bringt mich aber der Lösung zu meiner Frage nicht näher.
Moderator #6164216
c r schrieb:
> Korrekt, danke, bringt mich aber der Lösung zu meiner Frage nicht näher.

Warum nicht? Damit ist doch schon einmal ein erster, offensichtlicher
Fehler aufgedeckt.

Mir ist klar, dass da sicher noch weitere Fehler sind, nur sind diese
mangels näherer Informationen oder Quellcode von einem Außenstehenden
nicht reproduzierbar.

Irgendwie habe ich auch das Gefühl, dass dein tatsächlicher Code völlig
von dem abweicht, was du hier gepostet bzw. verbal beschrieben hast.

Sonst würde bspw. hier

1
set_initial_state(['History'])

die Fehlermeldung

1
NameError: name 'set_initial_state' is not defined

ausgegeben, wenn die einzige Funktion dieses Namens als Member-Funktion
in einer Klasse definiert ist.

Oder gibt es vielleicht eine freie Funktion mit demselben Namen? Dann
solltest du dir diese mal näher ansehen.

Ansonsten: Poste doch mal ein Minimalbeispiel, in dem dasselbe Problem
wie in deinem Code auftritt.
#6164673
mech schrieb:
> Ich verstehe nur nicht, was an meinem Aufruf falsch ist.

Womöglich sollte der Aufruf ein
1
self.set_initial_state(...)

sein. Immerhin ist das eine Methode, und bei denen muß man schon das 
Objekt angeben, auf dem die Methode aufgerufen werden soll (außer bei 
Methoden, die als classmethod oder staticmethod deklariert sind). Zum 
Beispiel:
1
class Foo(object):
2
    def __init__(self):
3
        self._init_('foo', 'bar')
4

5
    def _init_(self, *args):
6
        pass

Ansonsten... keine Ahnung, was es ist, aber aus irgendeinem Grund hab' 
ich bei Deinem Code ein komisches Gefühl.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.