以下の例では、ReturnValue
クラスのすべての'resolve'
メソッドを明示的に定義する必要があります。Pythonで特に名前が付けられた動的クラスメソッド
ループ内でこれらのメソッドを自動的に定義できれば、同じことをやっているだけで、クラスメンバ変数の名前と一致するメソッドの名前が違います返されます。
これはPython 2.7で可能ですか?それはあまりにも多くの行を保存していない、
class ReturnValue(graphene.ObjectType):
class Meta:
interfaces = (ReturnKeys,)
def set_resolve_method(animal):
setattr(
ReturnValue,
'resolve_' + animal,
lambda self: getattr(self, animal)
)
for animal in ('dog', 'cat', 'horse', 'bear'):
# this function scoped the variable `animal`
set_resolve_method(animal)
をしかし、あなたは以下を参照してください。
import graphene
class ApiObj(object):
@staticmethod
def get_values_as_dictionary():
return {'dog': 'pound', 'cat': 'nip', 'horse': 'fly', 'bear': 'down'}
class ReturnKeys(graphene.Interface):
dog = graphene.String()
cat = graphene.String()
horse = graphene.String()
bear = graphene.String()
class ReturnValue(graphene.ObjectType):
class Meta:
interfaces = (ReturnKeys,)
def resolve_dog(self):
return self.dog
def resolve_cat(self):
return self.cat
def resolve_horse(self):
return self.horse
def resolve_bear(self):
return self.bear
api = ApiObj()
value_dict = api.get_values_as_dictionary()
rv = ReturnValue(**value_dict)
print rv.resolve_cat()
print rv.resolve_dog()
print rv.resolve_horse()
print rv.resolve_bear()
ありがとう@martin、私はあなたの解決策をPython2で動かすことができました。影響を受けたクラスの中にすべてがカプセル化されていることに感謝します。デバッガを介して実行を追跡しようとすると、私はもっと混乱してしまいます...しかし、それは動作します! – Swoop
Btwの場合、 'resolve_xxx'は' Interface'のサブクラスでも実装できます。たぶんあなたの場合、 'ReturnValue'でそれらを持つ必要はありません。 –