2016-05-23 6 views
1

私はPython/Djangoの初心者です。この問題で私を助けてください。 これらのクラスプロパティをインスタンス化しようとしていますが、できません。dictの形式のアクセスクラスのプロパティpython django

これは

class PricingContext(object): 
    def __init__(self, order=None, availability=False): 
     self.order = order 
     self.availability = availability 

    @property 
    def available_suites(self): 
     if self.availability: 
      availability = calculate_available_suites(self.order) 
      return availability 

    @property 
    def price_codes(self): 
     return self.order.get('price_codes') 

    @property 
    def purchased_date(self): 
     return self.order.order_items[0].get('purchased_date') 

    @property 
    def suite_type(self): 
     return self.order.order_items[0]['item_name'] 

私のクラスであると私はこの

context_obj = PricingContext(context, availability) 
eval(self.discount_function, None, context_obj) 

のようにインスタンス化しようとしていますが、ここでself.discount = "'PRICE_CODE' in context_obj.price_codes"

を想定しかし、それは、このエラーがスローされます。 例外TypeError:私はcontext_obj .__ dict__にを渡すしようとした場合、それらはのinit

に記載されているので、地元の人々がマッピング

にする必要があり、それが唯一の self.orderとself.availabilityをインスタンス化initで初期化せずに、これらのプロパティをすべてインスタンス化することを、私のユースケースと一緒には行かないようにしたい。 eval()が必要とする場合にのみ、それぞれのプロパティを呼び出す必要があります。

可能かどうかを教えてください。 ありがとうございました。助けていただければ幸いです。

+0

これは良い考えではありません。なぜ割引機能を文字列として保存する必要がありますか? –

+0

@DanielRoseman evalは最初のパラメータを文字列の形で取ります。したがって、ここでdiscount_functionは、3番目のパラメータに渡されたdictに基づいて評価されるルールです。 – Shagun

+1

それは私が意味するものではありませんでした。なぜあなたはevalをまったく使いたいのですか?ほとんどの場合、それを避ける方が良いです。 –

答えて

1

問題はevalがマッピングを期待していることです。マッピングは、dictの抽象親クラスであり、特定のインタフェースを持っています。独自のマッピングcollections.Mappingを使用することであることを確認するための最も簡単な方法は、大文字と小文字にマッピング例えば:

import collections 
from string import ascii_lowercase 

class toUpper(collections.Mapping): 
    def __getitem__(self, key): 
     if len(key) == 1 and key in ascii_lowercase: 
      return key.upper() 
     else: 
      raise KeyError 

    def __len__(self): 
     return 26 

    def __iter__(self): 
     return ((k, k.upper()) for k in ascii_lowercase) 

をあなたがする必要があるのはキーが可変である独自のマッピングを行うことですevalによって必要とされる名前。各キーの値は、必要に応じてオンザフライで計算したり、キャッシュに保存することができます。ちょうど楽しみのため

eval('"".join([c, a, p, s, l, o, c, k])', None, toUpper()) 
+0

私を正しい方向に送ることに感謝します。 – Shagun

0

これが解決策です。

私はこれを私のクラスに追加しました。 evalはキーを探し、対応するプロパティにアクセスします。

def __getitem__(self, key): 
     return self.__getattribute__(key)