7

これを行う最善の方法を探し回っていますが、完全に説得力のあるものは何も見つかりませんでした。

私は、ユーザー オブジェクトと、それらのユーザーを管理するコレクションを持つシステムを作成しています。各ユーザーには名前があり、ユーザーの名前またはユーザー オブジェクト自体のいずれかを取ることができるマネージャーで関数を指定したいと考えています。

class UserManager: 
  def remove_user(self,user_or_username):
    #If user_or_username is a string
    remote.remove(user_or_username)
    #If user_or_username is a User object
    remote.remove(user_or_username.name)

これを行う気の利いた方法はありますか、それとも isinstance を使用するのが良いですか?

4

4 に答える 4

5

mgilsonのようなソリューションですが、わずかに異なります。

def remove_user(self,user_or_username):
    try:
        #If user_or_username is a User object
        username = user_or_username.name
    except AttributeError:   #Oops -- didn't works.  ask forgiveness ;-)
        #If user_or_username is a string
        username = user_or_username
    remote.remove(username)

なんで?このように、AttributeErrorsinremove()は抑制されません。

関係ないかもしれませんが、私は本当に例外処理を意図した場所に集中して例外処理を行うことを好みます。

于 2012-05-15T13:03:05.927 に答える
3

使用isinstanceすることは良いアプローチです...このソリューションにはもう1つのアプローチがあります

if hasattr(user_or_username, 'name'):
    # this object has <name> attribute
    remote.remove(user_or_username.name)
else:
    remote.remove(user_or_username)
于 2012-05-15T13:02:35.177 に答える
2

を使用しますisinstanceが、これも機能します。

def remove_user(self, user):
   if hasattr(user, "name"):
      self.remove(user.name)
   else:
      self.remove(user)
于 2012-05-15T13:00:55.727 に答える
2

ときどき Python の人々は、「許可よりも許しを求めるほうがよい」と言うのが好きです...

  def remove_user(self,user_or_username):
    try:
        #If user_or_username is a User object
        remote.remove(user_or_username.name)
    except AttributeError:   #Oops -- didn't works.  ask forgiveness ;-)
        #If user_or_username is a string
        remote.remove(user_or_username)

しかし、それは本当に好みの問題だと言います。文字列またはインスタンスisinstanceのみを取得することがわかっている場合も、同じように簡単に使用できます。User

于 2012-05-15T12:58:58.797 に答える