Forum: PC-Programmierung Python Methode lässt sich ohne optionales Argument nicht aufrufen


von c r (Gast)


Lesenswert?

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?

: Verschoben durch Moderator
von Hannes (Gast)


Lesenswert?

Die Methode welchen Objektes rufst du denn hier auf? Ich sehe nur 
Funktionsaufrufe.

von Dirk K. (merciless)


Lesenswert?

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

: Bearbeitet durch User
von mech (Gast)


Lesenswert?

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.

von c r (Gast)


Lesenswert?

Sorry,

c r = mech

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von c r (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Sheeva P. (sheevaplug)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.