我希望能夠使用'attr' in instance語法來檢查我的資料類是否具有指定的屬性,但我似乎無法使其作業。
我想要的是與熊貓這個例子相同的行為
import pandas as pd
df = pd.DataFrame(columns=['a', 'b', 'c'])
print('a' in df)
True
但僅適用于自定義資料類
from dataclasses import dataclass
@dataclass
class User:
email: int
password: str
blocked_at: float = None
def __getitem__(self, item):
return getattr(self, item)
user = User('[email protected]', 'password')
print(user['email'])
'email' in user
[email protected]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [35], in <cell line: 1>()
----> 1 'email' in user in User.__getitem__(self, item)
7 def __getitem__(self, item):
----> 8 return getattr(self, item)
TypeError: getattr(): attribute name must be string
uj5u.com熱心網友回復:
發生的事情是您沒有定義正確的鉤子。您要實作該__contains__方法。
因為您沒有這樣做,所以in操作員切換到后備模式:迭代物件,就好像它是一個序列一樣,所以它會嘗試object[0],thenobject[1]等,直到它遇到一個IndexError或找到與您正在測驗的值相等的東西. 因此,例外,item原樣0。
使用hasattr而不是getattr, 因為你想要一個布爾結果。對于您的__getitem__,您要確保將AttributeError例外轉換為KeyError例外,以保持界面一致:
from __future__ import annotations
from dataclasses import dataclass
@dataclass
class User:
email: int
password: str
blocked_at: float = None
def __getitem__(self, item: str) -> str | int | float | None:
try:
return getattr(self, item)
except AttributeError:
raise KeyError(item) from None
def __contains__(self, item: str) -> bool:
return hasattr(self, item)
演示:
>>> user = User('[email protected]', 'password')
>>> print(user['email'])
[email protected]
>>> 'email' in user
True
>>> user["nonesuch"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 12, in __getitem__
KeyError: 'nonesuch'
有關如何回退到迭代的詳細資訊,請參閱關于成員資格測驗操作的 Python 參考部分:in
對于沒有定義
__contains__()但確實定義的用戶定義類__iter__(),x in y如果在迭代時產生了True某個z運算式為真的值。如果在迭代程序中引發例外,就好像引發了該例外。x is z or x == zyin最后,嘗試使用舊式迭代協議:如果一個類定義了
__getitem__(),當且x in y僅True當有一個非負整數索引i滿足x is y[i] or x == y[i],并且沒有更低的整數索引引發IndexError例外時。(如果引發任何其他例外,就好像引發了該例外)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/462502.html
