dicedo-dicts كخصائص
-
01-10-2019 - |
سؤال
لدي فئة بيثون C
والتي يجب أن تحتوي على اثنين من الزائفة-dict
س a
و b
. مصطلح الأطراف الزائفة يعني أن القواميس غير موجودة فعليًا وأنها "يتم إعادة حسابها" في كل مرة يتم فيها الوصول إلى المفتاح.
في الكود الكاذب ، سيبدو هذا هكذا:
class C:
def a.__getitem__(self, key):
return 'a'
def b.__getitem__(self, key):
return 'b'
>>> c = C()
>>> c.a['foo']
'a'
>>> c.b['bar']
'b'
يمكنني تنفيذ فصل ل a
و b
, ، ولكن نظرًا لأن كلاهما لديهما طرق قليلة فقط ، أتساءل عما إذا كانت هناك طريقة أكثر أناقة ودمجًا للقيام بذلك.
المحلول
لماذا لا تحدد فصلك فقط؟
class PseudoDict(object):
def __init__(self, c):
self.c = c
def __getitem__(self, key):
return self.c.somethingmagical()
class C(object):
def __init__(self):
self.a = PseudoDict(self)
self.b = PseudoDict(self)
c = C()
print c.a['foo']
print c.b['bar']
لست متأكدًا من أين تأتي قيم هذه "الأطراف الزائفة" ، لذلك يجب عليك تحديث __getitem__
طريقة.
نصائح أخرى
مثله؟
from collections import defaultdict
class C:
a = defaultdict(lambda:'a')
b = defaultdict(lambda:'b')
c=C()
print c.a['foo']
print c.b['bar']
أو ربما مثل هذا لوظائف الحساب الحقيقية؟
from collections import defaultdict
class C:
def __init__(self):
self.a = defaultdict(self.geta)
self.b = defaultdict(self.getb)
def geta(self):
return 'a'
def getb(self):
return 'b'
c=C()
print c.a['foo']
print c.b['bar']
لا تنتمي إلى StackOverflow