Python'da, bir sınıf nesnesini bir dikteye nasıl çeviririm


89

Diyelim ki python'da basit bir dersim var

class Wharrgarbl(object):
    def __init__(self, a, b, c, sum, version='old'):
        self.a = a
        self.b = b
        self.c = c
        self.sum = 6
        self.version = version

    def __int__(self):
        return self.sum + 9000

    def __what_goes_here__(self):
        return {'a': self.a, 'b': self.b, 'c': self.c}

Çok kolay bir şekilde tam sayıya çevirebilirim

>>> w = Wharrgarbl('one', 'two', 'three', 6)
>>> int(w)
9006

Hangisi harika! Ama şimdi benzer bir şekilde onu bir emir haline getirmek istiyorum

>>> w = Wharrgarbl('one', 'two', 'three', 6)
>>> dict(w)
{'a': 'one', 'c': 'three', 'b': 'two'}

Bunun işe yaraması için neyi tanımlamam gerekiyor? Her iki ikame çalıştı __dict__ve dictiçin __what_goes_here__ama dict(w)bir sonuçlandı TypeError: Wharrgarbl object is not iterableher iki durumda da. Sadece sınıfı yinelenebilir hale getirmenin sorunu çözeceğini sanmıyorum. Ayrıca düşünebildiğim kadar çok farklı "python cast object to dict" kelimesine sahip birçok Google'ı denedim, ancak alakalı hiçbir şey bulamadım: {

Ayrıca! Çağıran nasıl Bildirimi w.__dict__o içerecek şekilde gidiyor çünkü ne istiyorum yapmayacağım w.versionve w.sum. Ben döküm özelleştirmek isteyen dictben döküm özelleştirebilirsiniz aynı şekilde intkullanarak def int(self).

Bunun gibi bir şey yapabileceğimi biliyorum

>>> w.__what_goes_here__()
{'a': 'one', 'c': 'three', 'b': 'two'}

Ama yapmak pythonic yol var varsayıyorum dict(w)o kadar şey aynı tip olduğu için işi int(w)veya str(w). Daha pitonik bir yol yoksa, bu da sorun değil, sadece soracağımı düşündüm. Oh! Sanırım önemli olduğu için, bu python 2.7 için, ancak 2.4 eski ve bozuk bir çözüm için de süper bonus puanları.

Python sınıfına __dict __ () Aşırı Yüklenmesi konusunda buna benzer, ancak bunun bir kopya olmamasını garanti edecek kadar farklı olabilecek başka bir soru daha var . OP'nin sınıf nesnelerindeki tüm verileri sözlük olarak nasıl kullanacağını sorduğuna inanıyorum. Geri __dict__dönen sözlüğe her şeyin dahil edilmesini istemediğim için daha özelleştirilmiş bir yaklaşım arıyorum dict(). Genel ve özel değişkenler gibi bir şey aradığımı açıklamaya yeterli olabilir. Nesneler, hesaplamalarda kullanılan bazı değerleri depoluyor olacak ve sonuçta ortaya çıkan sözlüklerde görünmeye ihtiyacım olmayacak / görünmesini istemeyeceğim.

GÜNCELLEME: asdictÖnerilen rotayı seçtim ama sorunun cevabı olmasını istediğimi seçmek zor bir seçimdi. Hem @RickTeachey hem de @ jpmc26, kullanacağım cevabı sağladı, ancak eski daha fazla bilgi ve seçeneğe sahipti ve aynı sonuca ulaştı ve daha fazla oy aldı, ben de onunla gittim. Yine de her yere olumlu oylar veriyor ve yardım için teşekkürler. Stackoverflow üzerinde uzun ve sert bir şekilde gizlendim ve ayak parmaklarımı suya daha fazla sokmaya çalışıyorum.


1
bunu daha önce gördün mü? docs.python.org/3/reference/…
Garrett R

@GarrettR Faydalı, ancak bu konu hakkında pek fazla fikir vermiyor.
Zizouz212


@RickTeachey, daha özelleştirilebilir bir dikte temsili aramama rağmen, kesinlikle Aşırı Yükleniyor ... sorusuna benziyor. Örneğin nesne, diktede görmeyi umursamadığım şeyleri depoluyor olabilir.
penchant

Sorunuz yanıltıcı bir şekilde ifade edilmiştir, nesnenizi dikte temsile dönüştürmek veya atmak istemezsiniz (böylece, geri dönüştürürseniz nesneyi tamamen kurtarabilirsiniz). Yalnızca genel örnek değişkenleri için (örneğin) bir dikte temsil görünümü oluşturmak istiyorsunuz.
smci

Yanıtlar:


124

En az beş altı yol vardır. Tercih edilen yol, kullanım durumunuzun ne olduğuna bağlıdır.

1. Seçenek: Bir asdict()yöntem eklemeniz yeterlidir .

Problem tanımına dayanarak, asdictdiğer cevapların önerdiği şeyleri yapmanın yolunu çok düşünürdüm . Bunun nedeni, nesnenizin gerçekten bir koleksiyon gibi görünmemesidir:

class Wharrgarbl(object):

    ...

    def asdict(self):
        return {'a': self.a, 'b': self.b, 'c': self.c}

Aşağıdaki diğer seçenekleri kullanmak, hangi nesne üyelerinin anahtar-değer çifti olarak yinelenip belirtilmeyeceği çok açık olmadığı sürece diğerleri için kafa karıştırıcı olabilir.

Seçenek 1a: Sınıfınızı 'typing.NamedTuple'(veya çoğunlukla eşdeğerinden 'collections.namedtuple') devralın ve sizin için sağlanan _asdictyöntemi kullanın .

from typing import NamedTuple

class Wharrgarbl(NamedTuple):
    a: str
    b: str
    c: str
    sum: int = 6
    version: str = 'old'

Adlandırılmış bir demet kullanmak, sınıfınıza bir _asdictyöntem de dahil olmak üzere minimum çabayla çok sayıda işlevsellik eklemenin çok uygun bir yoludur . Bununla birlikte, bir sınırlama, yukarıda gösterildiği gibi, NT'nin tüm üyeleri içerecek olmasıdır _asdict.

Sözlüğünüze eklemek istemediğiniz üyeler varsa, _asdictsonucu değiştirmeniz gerekir :

from typing import NamedTuple

class Wharrgarbl(NamedTuple):
    a: str
    b: str
    c: str
    sum: int = 6
    version: str = 'old'

    def _asdict(self):
        d = super()._asdict()
        del d['sum']
        del d['version']
        return d

Diğer bir sınırlama, NT'nin salt okunur olmasıdır. Bu istenebilir veya istenmeyebilir.

2. Seçenek: Uygulama __iter__.

Bunun gibi, örneğin:

def __iter__(self):
    yield 'a', self.a
    yield 'b', self.b
    yield 'c', self.c

Şimdi şunları yapabilirsiniz:

dict(my_object)

Bu işe dict()yarar çünkü (key, value)yapıcı bir sözlük oluşturmak için yinelenebilir çiftleri kabul eder . Bunu yapmadan önce, nesneyi bir dizi anahtar, değer çifti olarak bu şekilde yinelemenin dict- a oluşturmak için uygun olsa da - aslında başka bağlamlarda şaşırtıcı bir davranış olup olmayacağını kendinize sorun . Örneğin, kendinize şu soruyu sorun: "Davranışı ne olmalı list(my_object)...?"

Ek olarak, doğrudan öğe alma obj["a"]sözdizimini kullanarak değerlere erişmenin çalışmayacağını ve anahtar kelime bağımsız değişkeninin paketten çıkarılmasının çalışmayacağını unutmayın. Bunlar için haritalama protokolünü uygulamanız gerekir.

Seçenek 3: Uygulama haritalama protokolü . Bu, anahtarla erişim davranışına, dictkullanmadan __iter__a'ya çevirmeye izin verir ve ayrıca {**my_obj}tüm anahtarlar dizelerden ( dict(**my_obj)) ise paket açma davranışı ( ) ve anahtar kelime açma davranışı sağlar .

Eşleme protokolü, (en az) iki yöntemi birlikte sağlamanızı gerektirir: keys()ve __getitem__.

class MyKwargUnpackable:
    def keys(self):
        return list("abc")
    def __getitem__(self, key):
        return dict(zip("abc", "one two three".split()))[key]

Şimdi aşağıdaki gibi şeyler yapabilirsiniz:

>>> m=MyKwargUnpackable()
>>> m["a"]
'one'
>>> dict(m)  # cast to dict directly
{'a': 'one', 'b': 'two', 'c': 'three'}
>>> dict(**m)  # unpack as kwargs
{'a': 'one', 'b': 'two', 'c': 'three'}

Yukarıda belirtildiği gibi, yeterince yeni bir python sürümü kullanıyorsanız, eşleme protokolü nesnenizi de bunun gibi bir sözlük anlayışına dönüştürebilirsiniz (ve bu durumda anahtarlarınızın dizge olması gerekmez):

>>> {**m}
{'a': 'one', 'b': 'two', 'c': 'three'}

Eşleme protokol Not önceliklidir__iter__ bir nesneyi döküm sırasında yöntemi dict(diğer bir deyişle, kwarg açma kullanmadan doğrudan dict(m)). Dolayısıyla, nesnenin bir yinelenebilir (örneğin list(m)) olarak kullanıldığında ve a dict( dict(m)) ' ya dönüştürüldüğünde farklı davranışlara sahip olmasına neden olmak mümkündür ve bazen uygundur .

Bu çeviride : Eğer haritalama protokolünü kullanmak CAN diye, sen anlamina gelmez GEREKEN bunu . Nesnenizin bir dizi anahtar-değer çifti olarak veya anahtar kelime argümanları ve değerleri olarak aktarılmasıgerçekten mantıklı mı? Ona anahtarla erişmek - tıpkı bir sözlük gibi - gerçekten mantıklı mı?

Bu soruların cevabı evet ise , bir sonraki seçeneği düşünmek muhtemelen iyi bir fikirdir.

4. Seçenek: kullanarak içine bak 'collections.abc'modülü .

Sınıfınızı diğer kullanıcılardan miras almak 'collections.abc.Mappingveya 'collections.abc.MutableMappingdiğer kullanıcılara, tüm amaç ve amaçlar için, sınıfınızın bir eşleme * olduğunu ve bu şekilde davranmasının beklenebileceğini gösterir.

Hala dictistediğiniz gibi nesnenizi atabilirsiniz , ancak bunu yapmak için muhtemelen çok az nedeniniz olacaktır. Ördek yazımından dolayı, eşleme nesnenizi a'ya çevirme zahmeti dict, çoğu zaman gereksiz ek bir adım olur.

Bu cevap da yardımcı olabilir.

Aşağıdaki yorumlarda belirtildiği gibi: bunu abc yöntemiyle yapmanın esasen nesne sınıfınızı benzer bir sınıfa dönüştürdüğünden bahsetmeye değer dict( MutableMappingsalt okunur Mappingtemel sınıfı değil, kullandığınızı varsayarak ). Yapabileceğiniz dicther şeyi kendi sınıf nesnenizle yapabilirsiniz. Bu arzu edilebilir veya istenmeyebilir.

Ayrıca numbersmodüldeki sayısal abc'lere bakmayı da düşünün :

https://docs.python.org/3/library/numbers.html

Aynı zamanda nesnenizi bir nesneye intyayınladığınız için, esasen sınıfınızı tam teşekküllü bir hale getirmek daha mantıklı olabilir, intböylece döküm gerekli değildir.

Seçenek 5: kullanarak içine Bak dataclassesmodülü uygun bir içermektedir (Python 3.7 için), asdict()yardımcı bir yöntem.

from dataclasses import dataclass, asdict, field, InitVar

@dataclass
class Wharrgarbl(object):
    a: int
    b: int
    c: int
    sum: InitVar[int]  # note: InitVar will exclude this from the dict
    version: InitVar[str] = "old"

    def __post_init__(self, sum, version):
        self.sum = 6  # this looks like an OP mistake?
        self.version = str(version)

Şimdi bunu yapabilirsiniz:

    >>> asdict(Wharrgarbl(1,2,3,4,"X"))
    {'a': 1, 'b': 2, 'c': 3}

Seçenek 6: Kullanım typing.TypedDictolmuştur, piton 3.8 katma .

NOT: seçenek 6, muhtemelen OP'nin veya bu sorunun başlığına göre diğer okuyucuların aradığı şey DEĞİLDİR . Aşağıdaki ek yorumlara bakın.

class Wharrgarbl(TypedDict):
    a: str
    b: str
    c: str

Bu seçeneği kullanarak, ortaya çıkan nesne birdict (vurgu: a değildirWharrgarbl ). Onu bir dikteye "çevirmek" için hiçbir neden yoktur (bir kopya yapmıyorsanız).

Ve nesne a olduğu içindict , başlatma imzası ile aynıdır dictve bu nedenle yalnızca anahtar kelime argümanlarını veya başka bir sözlüğü kabul eder.

    >>> w = Wharrgarbl(a=1,b=2,b=3)
    >>> w
    {'a': 1, 'b': 2, 'c': 3}
    >>> type(w)
    <class 'dict'>

Vurgulanan : Yukarıdaki "sınıf" Wharrgarblaslında yeni bir sınıf değil. dictTip denetleyicisi için farklı türlerde alanlara sahip yazılı nesneler oluşturmak için basit bir sözdizimsel şekerdir .

Bu nedenle, bu seçenek, kodunuzun okuyucularına (ve ayrıca mypy gibi bir tür denetleyicisine) böyle bir dictnesnenin belirli değer türlerine sahip belirli anahtarlara sahip olmasının beklendiğini bildirmek için oldukça uygun olabilir .

Ancak bu, örneğin deneyebileceğiniz halde başka yöntemler ekleyemeyeceğiniz anlamına gelir:

class MyDict(TypedDict):
    def my_fancy_method(self):
        return "world changing result"

... ama işe yaramayacak:

>>> MyDict().my_fancy_method()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'my_fancy_method'

* "Haritalama", dictbenzeri ördek türünün standart "adı" haline geldi


1
Bu , OP'nin istediği etkiyi elde etmenin bir yoludur, ancak bunun başka etkileri olduğunu, örneğin for k, v in my_objectetkinleştirileceğini belki netleştirmelisiniz .
zwol

@RickTeachey Asdict noktası ile neye gittiğinizi görüyorum. Nesnelerin yinelenebilir olmasına kesinlikle ihtiyacım yok.
penchant

Diğer linkhttps: //stackoverflow.com/questions/61517/python-dictionary-from-an-objects-fields'de belirtildiği gibi neden basitçe vars işlevini kullanabiliriz? Bu soruda bir şey eksik mi?
kullanıcı

@user OP'ın soru yalnızca üyeler istedik a, bve cde dict. varsİşlev değil istedim olanlar da dahil olmak nesne üyelerinin ALL bir sözlük döndürür: sumve version. Bazı durumlarda varsişe yarayacak ama benim deneyimime göre gerçekten deyimsel python değil. Genellikle insanlar daha açık sözlüdür, örneğin "Şimdi nesnemi bir sözlüğe atıyorum" diyorlar obj.asdict(). İle vars, genellikle daha çok obj_kwargs = vars(obj)takip eden gibi bir şeydir MyObject(**obj_kwargs). Başka bir deyişle: varsçoğunlukla nesneleri kopyalamak için kullanılır.
Rick Monica'yı

geri dönen bir yöntem eklemeye ne dersiniz self.__dict__?
user32882

19

İstediğini yapacak sihirli bir yöntem yok. Cevap, uygun şekilde adlandırmaktır. öncelikle esinlenen, asdictdüz bir dönüşüm için makul bir seçimdir . Bununla birlikte, yönteminiz, bu addan hemen anlaşılmayan özel bir mantık içerecektir; sınıfın yalnızca bir alt kümesini döndürüyorsunuz. Kavramları açıkça anlatan biraz daha ayrıntılı bir ad bulabilirseniz, çok daha iyi.dictnamedtuple

Diğer yanıtlar kullanmayı önerir __iter__, ancak nesneniz gerçekten yinelenebilir değilse (bir dizi öğeyi temsil etmedikçe), bu gerçekten çok az anlam ifade eder ve yöntemin garip bir şekilde kötüye kullanılması anlamına gelir. Bazı sınıf devletlerini filtrelemek istemeniz, bu yaklaşımı daha da şüpheli hale getiriyor.


evet, sınıfın tüm durumunun bir alt kümesini, alaka düzeyini döndürmek, başarmaya çalıştığım şeydir. Hesaplamalar / karşılaştırmalar vb. İçin işleri hızlandıran bazı "gizli" değerlerim var, ancak bunlar bir insanın görmek veya oynamak isteyeceği hiçbir şey değil ve aynı zamanda nesnenin kendisini gerçekten temsil etmiyor.
penchant

@ tr3buchet Örnek kodunuzda, bu değerler başlatıcıya aktarılır . Gerçek kodunuzda böyle mi? Önbelleğe alınan hesaplamaların bağımsız değişken olarak aktarılması garip görünüyor.
jpmc26

hiç de değil, sadece bir örnek vermek için yapıyordum
meraklı

Diğer yanıtların önerdiği gibi , dokümanların kullanılmasının hoş göründüğünü belirtmek isteriz __iter__: "Eşlemeler için, kabın anahtarları üzerinde yinelenmeli ve aynı zamanda iterkeys () yöntemi olarak da kullanılabilir hale getirilmelidir."
dbenton

@dbenton OP'nin yaptığı ya da diğer yanıtların önerdiği şey bu değil. OP'nin nesnesi, bu bağlamda temelde koleksiyonun eşanlamlısı olarak kullanılan bir "kapsayıcı" değildir. OP'nin nesnesi de genellikle haritalama ile kastedilen şey değildir. Eşleme, keyfi sayıda anahtar ve değere sahip olan ve Mappingtemel sınıfı genişletmesi gereken bir şey olacaktır . Belirli adlandırılmış niteliklere sahip bir nesne bu kategoriye girmez.
jpmc26

11

bunun gibi bir şey muhtemelen işe yarar

class MyClass:
    def __init__(self,x,y,z):
       self.x = x
       self.y = y
       self.z = z
    def __iter__(self): #overridding this to return tuples of (key,value)
       return iter([('x',self.x),('y',self.y),('z',self.z)])

dict(MyClass(5,6,7)) # because dict knows how to deal with tuples of (key,value)

Oh ilginç! tupleların yinelenen bir hali, bunu dikkate almadım. Hızlı bir test yapacağım
penchant

Ayrıca, tuple listesinin bir yinelemesini döndürmek, x, y ve z'nin tüm değerlerini yinelemenin dayandığı listeye anlık görüntüler. 3 verim ifadesinin olması durumunda, bunu iş parçacıklı bir ortamda çalıştırmanın başka bir iş parçacığının y özniteliğini veya z özniteliğini değiştirmesiyle sonuçlanması mümkündür (küçük bir pencere, ancak yine de), rapor edilen x, y ve z tutarlı değil.
PaulMcG

@PaulMcGuire: CPython, Joran'ın koduyla bile tutarlı olacaklarını garanti ediyor mu? Örneğin, ilk tuple xoluşturulduktan sonra , ancak ikinci dizilimden önce başka bir iş parçacığının planlanabileceğini düşünürdüm y. Yanılıyor muyum ve aslında liste anlayışı iş parçacığı zamanlaması açısından atomik mi?
Steve Jessop

Şimdi sorduğunuza göre, Python'un iş parçacığı değiştiricisi kaynak düzeyinde değil, bayt kodu düzeyinde yaptığı için, liste anlamanın bile atomik garanti edilmediğini anlıyorum. Ancak, maruz kalmanız yalnızca listeyi oluşturma süresi içindir - liste oluşturulduktan sonra, özelliklerde yapılan herhangi bir güncelleme önemli olmayacaktır (özellik değerleri değiştirilebilir nesneler olmadığı sürece). disGerçek bayt kodlarını görüntülemek için modülü kullanmak en iyisidir.
PaulMcG

11

Bunun senin için çalışacağını düşünüyorum.

class A(object):
    def __init__(self, a, b, c, sum, version='old'):
        self.a = a
        self.b = b
        self.c = c
        self.sum = 6
        self.version = version

    def __int__(self):
        return self.sum + 9000

    def __iter__(self):
        return self.__dict__.iteritems()

a = A(1,2,3,4,5)
print dict(a)

Çıktı

{'a': 1, 'c': 3, 'b': 2, 'toplam': 6, 'sürüm': 5}


toplam ve versiyona ne oldu? Bu __dict__, önerilen diğer cevap gibi erişmekten nasıl farklıdır ?
Joran Beasley

dikte değil. iteritems çağrısı bir yineleyici döndürüyor
Garrett R,

1
Bu cevap gibi ben ... ama buna ... OP'ın gereksinimlerini karşılayan önce biraz daha çalışmak gerekir
Joran Beasley

bu yanıt @JoranBeasley'den gerçekten farklı değil. Aradaki fark, onun seçicidir, oysa sizin self.__dict__nesnenin sözlük versiyonunda olmasını istemediğim öğeleri içeren bütünü sizin alırsınız .
penchant

6

Diğerleri gibi, bir sözlüğe çevrim yapmaya izin vermek yerine (veya buna ek olarak) bir to_dict () işlevinin uygulanmasını öneririm. Bence sınıfın bu tür bir işlevselliği desteklediğini daha açık hale getiriyor. Böyle bir yöntemi kolayca uygulayabilirsiniz:

def to_dict(self):
    class_vars = vars(MyClass)  # get any "default" attrs defined at the class level
    inst_vars = vars(self)  # get any attrs defined on the instance (self)
    all_vars = dict(class_vars)
    all_vars.update(inst_vars)
    # filter out private attributes
    public_vars = {k: v for k, v in all_vars.items() if not k.startswith('_')}
    return public_vars

1

Sorunun tüm içeriğini bilmeden söylemek zor, ama ben geçersiz kılmam __iter__.

Ben uygulayacağını __what_goes_here__sınıfı.

as_dict(self:
    d = {...whatever you need...}
    return d

Hayır, değişkenlerin içinde saklandığı şey bu.
Zizouz212

3
Bunun w.__dict__ihtiyacım olan şeyi yapmadığını özellikle belirttim .
penchant

Ama __dict__geçersiz kılınabilir, değil mi?
noisewaterphd

@noisewaterphd hayır bu sihirli bir yöntemdir (belki onu geçersiz kılabilirsiniz, ancak en azını söylemek korkutucu sonuçlar olabilir)
Joran Beasley

1
Neden dikteden miras almıyorsunuz veya belki de daha iyisi, sınıfta onu bir dikt olarak döndürmek için bir yöntem yaratın.
noisewaterphd

0

Ben "hem" bir olan bir sınıf yazmaya çalışıyorum listya da dict. Programcının bu nesneyi hem a list(anahtarları bırakarak) hem de dict( anahtarlarla) "çevirebilmesini" istiyorum .

Python'un şu anda dict()cast yapma şekline bakıldığında: İletilen Mapping.update()nesne ile çağırır . Bu Python deposundaki koddur :

def update(self, other=(), /, **kwds):
    ''' D.update([E, ]**F) -> None.  Update D from mapping/iterable E and F.
        If E present and has a .keys() method, does:     for k in E: D[k] = E[k]
        If E present and lacks .keys() method, does:     for (k, v) in E: D[k] = v
        In either case, this is followed by: for k, v in F.items(): D[k] = v
    '''
    if isinstance(other, Mapping):
        for key in other:
            self[key] = other[key]
    elif hasattr(other, "keys"):
        for key in other.keys():
            self[key] = other[key]
    else:
        for key, value in other:
            self[key] = value
    for key, value in kwds.items():
        self[key] = value

Yinelediği if ifadesinin son alt harfi, otherçoğu insanın aklında olanıdır. Ancak gördüğünüz gibi keys()mülk sahibi olmak da mümkün . Bu, a ile birleştirildiğinde __getitem__(), bir alt sınıfın bir sözlüğe uygun şekilde dönüştürülmesini kolaylaştırması gerekir:

class Wharrgarbl(object):
    def __init__(self, a, b, c, sum, version='old'):
        self.a = a
        self.b = b
        self.c = c
        self.sum = 6
        self.version = version

    def __int__(self):
        return self.sum + 9000

    def __keys__(self):
        return ["a", "b", "c"]

    def __getitem__(self, key):
        # have obj["a"] -> obj.a
        return self.__getattribute__(key)

O zaman bu işe yarayacak:

>>> w = Wharrgarbl('one', 'two', 'three', 6)
>>> dict(w)
{'a': 'one', 'c': 'three', 'b': 'two'}

Eşleme protokolünü uyguladınız. Yukarıdaki cevabımda Seçenek 3'e bakın . Ayrıca listanahtarların bırakılmasını da istiyorsanız __iter__, değerleri yineleyen bir yöntem ekleyebilirsiniz ve dönüştürme dictişlemi çalışmaya devam edecektir. Genellikle sözlüklerde, bir listeye çevirirseniz, istediğiniz değerleri değil ANAHTARLARI geri vereceğini unutmayın. Bunun neden olduğu açık değilse, kodunuzu kullanan diğer kişiler için bu şaşırtıcı olabilir.
Rick Monica'yı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.