2011-06-07 19 views
6

Bir Unicode dizesi veya bir bayt (veya bytearray) nesnesini kabul edecek bir işlev yapıyorum. Sadece bu türlerin geçtiğinden emin olmak istiyorum. isinstance(x, str) yaparak bir şey olup olmadığını kontrol edebileceğimi biliyorum ve isinstance(x, bytes) or isinstance(x, bytearray) yazabileceğimi biliyorum.Süper sınıf bayt ve bytearray?

Sonunu kontrol etmek için daha kısa bir yol var mı, yani, hem bytes hem de bytearray'un türetildiği bir sınıf var mı?

>>> bytearray.__base__ 
<class 'object'> 
>>> bytes.__base__ 
<class 'object'> 

türü için kontrol etmeyin:

+1

Python 2 için ikili türüdür olarak

, ayrıca, özel bir durum olarak dizeleri kabul etmeleri gerekmektedir ? Neden açık bir şekilde türü kontrol edin? –

+0

@Jim: Bilmiyorum. Herhangi bir ikili veri için (egzersiz olarak) LZW sıkıştırmayı uygulamaya çalışıyorum. Kabul etmek için başka hangi türler mantıklı olurdu? – Javier

+3

Örneğin NumPy dizileri. Ya da C uzantı tipi kütüphanenizin kullanıcısını yazdı. Bunun ne tür yararlı olabileceğini bilmiyorsunuz. Aldığınız şeylerle çalışmayı deneyin - eğer tür gereksinimleri karşılamıyorsa kodunuz yine de başarısız olacaktır. –

cevap

6

object haricinde hiçbir ortak temel sınıf vardır. Kullanıcının istediği türde parametreleri geçirmesine izin verin. Eğer tür gerekli arabirime sahip değilse, kodunuz yine de başarısız olur.

+1

Bu [Ördek Yazma] (https://en.wikipedia.org/wiki/Duck_typing) ilkesidir. –

2

Sen kullanabilirsiniz:

isinstance(x, (bytes, bytearray)) 

Ancak duck typing, yararlı olabilecek diğer türler bayt veya ByteArray doğan, ancak doğru yöntemler işlevine geçebileceğini uygulanması değil.

+0

Ek paranteze ihtiyacınız var: 'isinstance (x, (bytes, bytearray))'. –

+0

Kesinlikle haklısınız. – Robin

2

Hiçbir koşulda ikili veri olmadığından Unicode dizelerini kabul etmek mantıklı değildir. Muhtemelen herhangi bir sıralamayı kabul ediyorum ve bu sıradaki herhangi bir öğe 0 ile 255 arasında bir tam sayı değilse (muhtemelen sıkıştırma sırasında farkedeceğiniz) bir hata ortaya çıkarırdım. Python 2 desteklemek istiyorsanız o niye yanı da fonksiyon gereksinimlerini destekleyen diğer türlerini kabul etmeyen

+0

İkili veri olmadıklarını anlıyorum, ancak dizeleri kabul etmenin mantıklı olduğunu düşündüm çünkü birisi metinleri sıkıştırmak isteyebilir. Bu işlev, bu durumu denetler ve dizeyi UTF-8 ikili temsiline çözer. – Javier

+1

@Javier Badia: Metinleri sıkıştırmak istiyorlarsa önce şifrelemelidirler. UTF8 kodlanmış Çince metnin sıkıştırılması, örneğin UTF-16'nın daha verimli bir kodlama olacağından oldukça anlamsızdır. Ve İngilizce metinleri UTF-16 kodlamasında sıkıştırmak eşit derecede aptalca olacaktır. –

+0

Sanırım bu mantıklı. Yardım için teşekkürler. – Javier

İlgili konular