2013-03-20 29 views
5

Bir google, bir MaleResponseMessage veya FemaleResponseMessage döndürebilmesi gereken yöntemi işaretleyebilir. gibigoogle bulut son nokta yöntemi

@endpoints.method(message_types.VoidMessage, [MaleResponseMessage, FemaleResponseMessage]) 

ile süper mesaj sınıfını ilan etme seçeneği elbette vardır belirtmek için bir yol var mı, diyelim ki, PersonResponseMessageMaleResponseMessage veya FemaleResponseMessage ya sarmak için. Ancak yukarıdaki snippet'e benzer bir şey var mı?

DÜZENLEME:

kendi önerisini uygulamaya çalışıyorum, ben takıldı. İki mesaj türünün ortak olduğu tek şey, istektir: PersonRequest için aynı istek alanları (ek bir boole female=true/false ile). MaleResponseMessage ve FemaleResponseMessage'un ortak bir alanı yoktur. Bu yüzden ben cevap almak için

if request.female : # request.female == True 
    return get_female(etc, etc) 
else: # request.female == False // implies male 
    return get_male(etc,etc) 

kontrol @bossylobster gösterdiği gibi, bir uç nokta yöntemi kullanıyorum, ben için ??? kontrol etmek emin değilim

class PersonResponse(messages.Message): 
    if ??? : 
    item = messages.MessageField(MaleResponseMessage,1) 
    else: 
     item = messages.MessageField(FemaleResponseMessage,1) 

gibi bir şey gerekiyor. İlk önce, isinstance veya type hakkında düşündüm. Ama bunu nasıl yapardım? Aşağıdaki işler mi?

+0

Sorunuz hakkında beğendiğim şey, aslında eşyalarınızı bildiğiniz gibi. Bu konuda sadece takıldınız. :) Eğer bossylobster ya da başka bir kişi yardım edemezse ama yine de oraya ulaşırsanız son çözümünüzü paylaşmayı unutmayın. – learner

+0

@Katedral Pillon, 'messages.Message' alt sınıflarının ne yaptıklarını yanlış anlıyorsunuz. Bir protokol arabelleği kapsayıcısı tanımı oluşturmanız için oradasınız, böylece yalnızca statik alanları listeleyebilirsiniz, koşullu 'if' ifadelerine izin verilir. – bossylobster

cevap

2

İki farklı son nokta yöntemi kullanabilirsiniz.

3

Maalesef no. Yalnızca bir yanıtınız ve bir istek şemanınız olabilir; Bunun nedeni, Google'ın API altyapısına kayıtlı olmaları ve sıkı bir şemaya sahip olmaları, isteklerin hızını ve verimliliğini sağlayan şeydir.

En iyi bahsiniz, her erkek ve dişi için ihtiyaç duyulan alanları tek bir model sınıfında birleştirmek ve kendi onayınızı yapmak olacaktır. male_response ve female_response erkek ve dişi tekabül PersonMessage örneklerini oluşturmak yöntemlerdir nerede

Muhtemel bir çözüm, gerçek yönteme

@endpoints.method(GenderRequest, PersonMessage, ...) 
    def my_method(self, request): 
     if request.gender == Gender.MALE: 
      return male_response(request) 
     elif request.gender == Gender.FEMALE: 
      return female_response(request) 
     else: 
      # This should never occur since gender is required 
      raise endpoints.BadRequestException('Gender not set.') 

sonra

from protorpc import messages 

class Gender(messages.Enum): 
    MALE = 0 
    FEMALE = 1 

class GenderRequest(messages.Enum): 
    gender = messages.EnumField(Gender, 1, required=True) 

class PersonResponse(messages.Message): 
    gender = messages.EnumField(Gender, 1) 
    # shared fields 
    # female specific fields 
    # male specific fields 

gibi bakmak ve olabilir.

+0

Kod pasajı için çok teşekkürler. Benim özel problemim, “MaleResponseMessage” ve “FemaleResponseMessage” ın ortak alanları yoktur. Lütfen daha fazla ayrıntı için düzenlememe bakın. Çok teşekkürler. –

+0

2 yaklaşımı deneyebilirsiniz: 1, @bossylobster tarafından verilen seçeneği kullanın ve erkek için gerekli tüm alanlar ve tüm alanlar için gerekli olan PersonResponse gibi ortak bir yanıt iletisi oluşturun. Şimdi, gerçek cevabı cinsiyete dayalı olarak gönderirken, değerleri yalnızca bu cinsiyet için gerekli alanlara atayın ve diğer cinsiyetler için boş veya 0'ı diğer alanlara koyun.2, ya da MaleResponse ve FemaleResponse'nizde aynı türden (Messagefield gibi) ve eşit sayılarda (5 gibi) varsa, o zaman jenerik alanları ve seçilen cinsiyete göre değerleri atayın genel bir mesaj kullanın. –

İlgili konular