Keyserver - Dateienaustausch und Abruf

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

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]
BlackJack

dankegut hat geschrieben:

Code: Alles auswählen

File "keyserver.py", line 119
    set_func, (*[key_dict[attr_name] for attr_name in attr_names])
                   ^
SyntaxError: invalid syntax
Also beim * meckert er.
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.
diese Zeile und die davor verstehe ich leider auch nicht so ganz, da ich mit set_func noch nie gearbeitet habe.
`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.
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]
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.

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
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

hallo,

so, nach längerer winterpause meld ich mich mal wieder :roll: 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.

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()

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

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")
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 :)
Antworten