2012-11-28 18 views
0

我已經構建了自己的類User,它有屬性userID。我重寫__repr__以便它是userID字符串。Python if語句找不到值

在另一個類中,我有一個數組self.users = []與幾個User實例。出於測試目的,我給他們的用戶ID的1和2。我使用:

'[%s]' % ','.join(map(str, self.users)) 

要打印數組的內容,產生:

[1,2] 

我想如果沿着聲明作出行:

if "1" in self.users: 
    print "True" 

以上是我想要實現的簡單表示。我已經嘗試了很多方法,並且我無法讓程序打印真實。有誰知道如何做到這一點?

+1

是self.users中的一個int值嗎?因爲你正在檢查字符串「1」。 – kreativitea

+0

不,值是一個字符串 –

+0

他將str構造函數映射到列表上。這不是問題。 – Wes

回答

3

你想:

if any("1" in str(x) for x in self.users): 
    print "True" 

可能是更好的是:

if any("1" == x.userID for x in self.users): 
    print True 

如果我正確地讀你的文章。


最後,根據對User的API,你可以在一個平等的測試使用ID

class User(object): 
    def __eq__(self,other): 
     return self.userID == other 
    #other methods here 

現在你可以使用__contains__in)的名單上,你試圖做最初:

if "1" in self.users: 
    print "True" 
+0

正如我對Blender所說的,鑑於他定義了'__repr__'而不是'__str__',我在這裏使用'repr(x)'。 – abarnert

+0

@abarnert - 也許。 '__str__'在默認情況下調用'__repr__',但是我認爲'str'是真正應該用在這裏的,我認爲OP應該重新考慮以這種方式覆蓋'__repr__'的決定) – mgilson

+0

是的,假設他沒有這樣定義(或者以後不這樣做)。正如Blender指出的那樣,最好先將'__repr__'改爲'__str__'。但無論哪種方式,我認爲這是有道理的搜索一個你確定定義的... – abarnert

2

"1" in self.users檢查是否字符串"1"爲i在名單self.users。你想,以檢查是否存在其字符串表示是"1"用戶,所以你可以嘗試這樣的:

if '1' in map(str, self.users): 
    print 'True 

另外,我會在你的類定義更改__repr____str__

__repr__通常返回一個字符串,該字符串可以用eval()返回到原始對象中,而__str__返回該對象的人類可讀表示。你在做後者,所以我建議你使用__str__而不是__repr__

我想通過這個問題,閱讀以及:Difference between __str__ and __repr__ in Python

+0

鑑於他定義了'__repr__'而不是'__str__',我在這裏使用'repr'而不是'str'。 – abarnert

+0

'itertools.imap'在這裏比較好,因爲它更適合簡短的互動 – inspectorG4dget

+0

@abarnert:看我的編輯。 – Blender

0

從你的問題的定義,這聽起來像你試圖找到,如果你有它的用戶ID屬性爲「1」的用戶。

事實上,您的__repr__函數碰巧使用userID作爲表示,這意味着這是搜索它的最佳方式。爲什麼不是這個?

if any(user.userID == '1' for user in self.users): 
    print "True" 

如果你確實需要搜索的字符串表示,當然,使用張貼mgilson或攪拌機答案(並找出你想要其中strrepr)。但如果沒有必要,不要這樣做。