also er gibt folgendes aus:
File "keyserver.py", line 119
set_func, (*[key_dict[attr_name] for attr_name in attr_names])
^
SyntaxError: invalid syntax
Also beim * meckert er.
diese Zeile und die davor verstehe ich leider auch nicht so ganz, da ich mit set_func noch nie gearbeitet habe. Also algo_map stellt ja ein dict dar, oder? Ich bin mir nicht sicher, ob das mit dem
(keys.set_rsa_key, ('algo', 'key', 'hashval',
'name', 'host'))
so richtig ist, wegen dem komma nach set_rsa_key?![/code]
Keyserver - Dateienaustausch und Abruf
Ja das darf auch nicht einfach so vor einer List-Comprehension stehen, sondern ist Teil eines Funktionsaufrufes. In der Zeile ist das aber kein Funktionsaufruf, weil Du zwischen den Funtkionsnamen und die Argumente ein Komma gesetzt hast. Nimm das mal weg, dann sollte es gehen.dankegut hat geschrieben:Also beim * meckert er.Code: Alles auswählen
File "keyserver.py", line 119 set_func, (*[key_dict[attr_name] for attr_name in attr_names]) ^ SyntaxError: invalid syntax
`set_func` ist ein ganz normaler Name, den kannst Du auch durch etwas anderes ersetzen. Die Funktion, an die dieser Name gebunden ist, wird aus dem Dictionary `algo_map` geholt.diese Zeile und die davor verstehe ich leider auch nicht so ganz, da ich mit set_func noch nie gearbeitet habe.
Doch das ist schon richtig. Das ist ein Tupel mit zwei Werten, ein Funktionsobjekt und ein weiteres Tupel mit Zeichenketten. Und in dem Dictionary `algo_map` wird der Name des Algoritmus auf so ein Tupel abgebildet. Du kannst also über den Namen die entsprechende Funktion zum Hinzufügen eines Schlüssels und die Namen der Werte aus dem `key_dict` aus dem Dictionary holen.Also algo_map stellt ja ein dict dar, oder? Ich bin mir nicht sicher, ob das mit dem
(keys.set_rsa_key, ('algo', 'key', 'hashval',
'name', 'host'))
so richtig ist, wegen dem komma nach set_rsa_key?![/code]
Was dann noch gemacht wird, ist das automatische Verteilen einer Sequenz, in diesem Fall das Tupel, auf mehrere Namen, in diesem Fall `set_func` und `attr_names`.
Und die *-Notation beim Aufruf "entpackt" auch eine Sequenz. Das Tupel ist ja *ein* Objekt bzw. das Ergebnis der List-Comprehension ist *eine* Liste, die Funktion erwartet aber die Elemente dieser Liste als einzelne Argumente. Das erreicht man mit der *-Notation.
Vielleicht hilft folgende Live-Session ein wenig beim Verständnis:
Code: Alles auswählen
In [14]: max(1, 5, 4)
Out[14]: 5
In [15]: a = (max, (1, 5, 4))
In [16]: a[0]
Out[16]: <built-in function max>
In [17]: a[1]
Out[17]: (1, 5, 4)
In [18]: b = { 'maximum': (max, (1, 5, 4)) }
In [19]: b
Out[19]: {'maximum': (<built-in function max>, (1, 5, 4))}
In [20]: b['maximum']
Out[20]: (<built-in function max>, (1, 5, 4))
In [21]: func, values = b['maximum']
In [22]: func
Out[22]: <built-in function max>
In [23]: values
Out[23]: (1, 5, 4)
In [24]: func(*values)
Out[24]: 5
hallo,
so, nach längerer winterpause meld ich mich mal wieder
erstmal danke blackjack, ich habs verstanden 
jetzt möchte ich gerne, das ganze in was grafisches umsetzen, also den client. Problem was sich mir stellt ist die Vererbung.
das ganze ist erstmal nur ein kleine testumgebung, um etwas grafisch am server abzufragen. ich mochte jetzt gerne in der searchKey Methode einen Key beim server suchen, doch, ausserhalb der run Methode im Client, wo praktisch steht wo der Server zu erreichen ist, kann ich den nicht mehr ansprechen, wie mache ich es mögliche, dass ein
und die "Variable" server auch in anderen Methoden sichtbar ist?! Da steh ich mal wieder aufm Schlauch.
Jemand vielleicht nen kleinen Tipp?
Frohes Neues
Christian
**EDIT**
hat sich schon erledigt
so, nach längerer winterpause meld ich mich mal wieder


jetzt möchte ich gerne, das ganze in was grafisches umsetzen, also den client. Problem was sich mir stellt ist die Vererbung.
Code: Alles auswählen
import wx
class clientGUI(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.search = wx.StaticBitmap(self, -1, wx.Bitmap("images/keysearch.gif", wx.BITMAP_TYPE_ANY))
#self.upload = wx.StaticBitmap(self, -1, wx.Bitmap("images/uploadkey.gif", wx.BITMAP_TYPE_ANY))
#self.delete = wx.StaticBitmap(self, -1, wx.Bitmap("images/deletekey.gif", wx.BITMAP_TYPE_ANY))
self.searchTxt = wx.TextCtrl(self, -1, "")
self.searchB = wx.Button(self, -1, "search")
self.Bind(wx.EVT_BUTTON, self.searchKey, self.searchB)
self.__set_properties()
self.__do_layout()
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("frame_1")
self.search.SetMinSize((100,100))
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1 = wx.GridSizer(1, 3, 0, 0)
gs_KeyS = wx.GridSizer(1,2,0,0)
# adjust search key
grid_sizer_1.Add(self.search, 0, wx.ADJUST_MINSIZE, 0)
grid_sizer_1.Add(gs_KeyS, 1, wx.EXPAND, 0)
grid_sizer_1.Add(self.searchTxt, 0, wx.ADJUST_MINSIZE, 0)
grid_sizer_1.Add(self.searchB, 0, wx.ADJUST_MINSIZE, 0)
sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0)
sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
sizer_1.SetSizeHints(self)
self.Layout()
def searchKey(self, event):
x = self.searchTxt.GetValue()
print x
def uploadKey():
pass
def deleteKey():
pass
if __name__ == "__main__":
app = wx.PySimpleApp(0)
frame = wx.Frame(None, -1, "Client",
size=(380, 380))
clientGUI(frame)
frame.Show(True)
app.MainLoop()
Code: Alles auswählen
class Client(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
server = xmlrpclib.Server("http://192.168.0.1:8000")
Jemand vielleicht nen kleinen Tipp?

Frohes Neues
Christian
**EDIT**
hat sich schon erledigt
