2010-01-02 8 views
1
# Example: provide pickling support for complex numbers. 

try: 
    complex 
except NameError: 
    pass 
else: 

    def pickle_complex(c): 
     return complex, (c.real, c.imag) # why return complex here? 

    pickle(complex, pickle_complex, complex) 

Pourquoi?
Le code suivant est la fonction de cornichon appelé:Pourquoi ce code retourne-t-il 'complexe'?

dispatch_table = {} 

def pickle(ob_type, pickle_function, constructor_ob=None): 
    if type(ob_type) is _ClassType: 
     raise TypeError("copy_reg is not intended for use with classes") 

    if not callable(pickle_function): 
     raise TypeError("reduction functions must be callable") 
    dispatch_table[ob_type] = pickle_function 

    # The constructor_ob function is a vestige of safe for unpickling. 
    # There is no reason for the caller to pass it anymore. 
    if constructor_ob is not None: 
     constructor(constructor_ob) 

def constructor(object): 
    if not callable(object): 
     raise TypeError("constructors must be callable") 
+0

Pouvez-vous fournir plus de détails sur exactement quel comportement vous voyez et ce que vous attendiez? –

+0

D'où vient ce code? –

+1

@Roger, le code provient du module copy_reg.py de la distribution Python standard. – Theran

Répondre

3

complex est la classe à utiliser pour reconstituer l'objet décapé. Il est retourné afin qu'il puisse être décapé avec les valeurs réelles et imag. Puis, quand l'unpickler arrive, il voit la classe et certaines valeurs à utiliser comme arguments pour son constructeur. Unpickler utilise la classe et les arguments donnés pour créer un nouvel objet complex équivalent à l'original qui a été décapé. Ceci est expliqué plus en détail dans copy_reg et pickle documentation.