Je fais une fonction qui acceptera une chaîne unicode ou un objet octets (ou byTearray). Je veux m'assurer que seuls les types sont passés. Je sais que je peux vérifier si quelque chose est une chaîne en faisant Y a-t-il un moyen plus concis de vérifier ce dernier, c'est-à-dire s'il existe une classe à partir de laquelle isinstance (x, str) code>, et je sais que je peux écrire isinstance (x, octets) ou isinstance (x, byteArray) code>. p>
octets code> et byteArray code> dérive? P>
3 Réponses :
Il n'y a pas de classe de base commune à l'exception de ne vérifie pas le type. Laissez l'utilisateur passer des paramètres de tout type qu'elle souhaite. Si le type n'a pas l'interface requise, votre code échouera de toute façon. P> p> objet code>:
Vous pouvez utiliser:
Vous avez besoin de parenthèses supplémentaires: isinstance (x, (octets, byteArray)) code>.
Il n'a pas de sens d'accepter les chaînes Unicode, car elles ne sont en aucun cas des données binaires. J'accepterais probablement une sorte de séquence et soulevez une erreur si un élément de cette séquence n'est pas un entier compris entre 0 et 255 (que vous découvrirez probablement pendant la compression). P>
Si vous souhaitez prendre en charge Python 2, vous devez également accepter des chaînes comme cas particulier, car c'est le type binaire de Python 2. P>
Je comprends qu'ils ne sont pas des données binaires, mais je pensais qu'il était logique d'accepter des chaînes parce que quelqu'un pourrait vouloir compresser le texte. La fonction vérifie cette affaire et décode la chaîne de la représentation binaire UTF-8.
@Javier Badia: S'ils veulent compresser du texte, ils doivent le coder en premier. La compression du texte chinois codé dans UTF8 est par exemple assez inutile, car l'UTF-16 sera un codage plus efficace. Et la compression du texte anglais dans l'encodage UTF-16 serait tout aussi stupide.
Je suppose que cela a du sens. Merci pour l'aide.
Pourquoi ne pas accepter d'autres types prenant en charge les exigences de votre fonction également? Pourquoi vérifier explicitement le type?
@Jim: Eh bien, je ne sais pas. J'essaie de mettre en œuvre (en tant qu'exercice) compression LZW pour toutes les données binaires. Quels autres types auraient-il logique d'accepter?
Par exemple des tableaux numpus. Ou le type d'extension C L'utilisateur de votre bibliothèque s'est effectivement écrit. Vous ne savez tout simplement pas quel type cela pourrait être utile. Essayez de travailler avec ce que vous obtenez - votre code échouera de toute façon si le type ne remplit pas les exigences.