2010-10-25 6 views
2

J'essaye d'enrouler l'opération de lecture et d'écriture d'une instance d'un objet de fichier (spécifiquement les méthodes readline() et write()).comment emballer l'opération de lecture et d'écriture d'objet de fichier (qui sont en lecture seule)?

normalement, je voudrais simplement remplacer ces fonctions par un emballage, un peu comme ceci:

def log(stream): 
    def logwrite(write): 
     def inner(data): 
      print 'LOG: > '+data.replace('\r','<cr>').replace('\n','<lf>') 
      return write(data) 
     return inner 
    stream.write = logwrite(stream.write) 

mais les attributs d'un objet de fichier sont en lecture seule! comment pourrais-je les emballer correctement? (Note: je suis trop paresseux pour envelopper tout l'objet de fichier ... vraiment, je ne veux pas manquer une fonctionnalité que je n'ai pas enveloppée correctement, ou une fonctionnalité qui pourrait être ajoutée dans une future version de python)

contexte plus:

je suis en train d'automatiser la communication avec un modem, dont le jeu de commandes est mis à disposition sur le réseau via une session Telnet. Une fois connecté, je vais "saisir" le module avec lequel je veux communiquer. après un certain temps sans activité, un timeout se produit qui libère le module (de sorte qu'il soit disponible pour les autres utilisateurs sur le réseau ... ce dont je me fiche, je suis le seul utilisateur de cet équipement). la version automatique écrit une ligne spécifique sur la session.

je veux envelopper le readline() sur un fichier construit à partir d'une prise (voir socket.makefile()) de sorte que lorsque le délai d'attente se produit, une exception est levée, afin que je puisse détecter le délai d'attente ne importe où dans le script et réagir de manière appropriée sans ce qui complique l'analyseur de commande AT ...

(bien sûr, je veux le faire parce que le délai d'attente est tout à fait faux, sinon je voudrais simplement nourrir le modem avec des commandes sans aucun effet secondaire seulement pour maintenir le module en vie)

(n'hésitez pas à proposer d'autres méthodes ou stratégies pour effectuez cet effet)

+0

Puisque vous avez seulement besoin de readline() et write(), pourquoi s'inquiéter de "une fonctionnalité que je n'ai pas enveloppée"? Veuillez expliquer quelles autres fonctionnalités mystérieuses seront utilisées. –

+1

Lorsque vous encapsulez des objets de type fichier, vous devez toujours vous soucier d'encapsuler tous les appels d'API pertinents: en général, supposons que toute méthode puisse être appelée, directement ou indirectement, ou que vous vous installiez plus tard pour des bogues obscurs . Dans ce cas, cela pourrait se traduire par "certains appels d'API ne dépassent pas". Si vous ne souhaitez pas implémenter les wrappers pour toutes les méthodes, remplacez-les par une méthode qui renvoie NotImplemented, de sorte que les appels de méthode inattendus soient immédiatement détectés. –

+0

Pourquoi ne pas simplement vous sous-classer le fichier? –

Répondre

2

Ce question peut T'aider. Vous pouvez utiliser la réponse acceptée pour envelopper l'objet fichier entier, mais implémenter uniquement les méthodes que vous souhaitez décorer. Les méthodes que vous ne décorez pas explicitement seront transmises automatiquement à l'objet interne.

3

utilisez __getattr__ pour envelopper votre objet fichier. fournir des méthodes modifiées pour celles qui vous intéressent.

class Wrapped(object): 
    def __init__(self, file_): 
     self._file = file_ 

    def write(self, data): 
     print 'LOG: > '+data.replace('\r','<cr>').replace('\n','<lf>') 
     return self._file.write(data) 

    def __getattr__(self, attr): 
     return getattr(self._file, attr) 

De cette façon, les demandes d'attributs que vous ne fournissez explicitement seront acheminés à l'attribut sur l'objet enveloppé et vous pouvez simplement mettre en œuvre ceux que vous voulez

logged = Wrapped(open(filename)) 
Questions connexes