![](/img/trans.png)
[英]How to check if a class has an attribute with `'attr' in instance` syntax
[英]How to check if class has attribute that are other classes
考慮以下 Python 代碼:
from pydantic import BaseModel
class customer_s3_buckets_object(BaseModel):
class s3_bucket(BaseModel):
access_key: str = None
secret_key: str = None
region: str = None
name: str = None
encryption_bucket: s3_bucket = s3_bucket()
file_transfer_bucket: s3_bucket = s3_bucket()
holding_bucket: s3_bucket = s3_bucket()
class customer_object(BaseModel):
s3_buckets: customer_s3_buckets_object = customer_s3_buckets_object()
進一步假設我有一個類型為customer_object
的變量my_customer
。 客戶可能擁有 3 個 s3 存儲桶的任意組合。 例如,某些客戶可能只有holding_bucket
而沒有file_transfer_bucket
和encryption_bucket
。
當客戶沒有存儲桶時,該屬性將由另一個初始化my_customer
的 function 設置為None
。
因此,例如, my_customer
的實例可能具有:
my_customer.s3_buckets.encryption_bucket
設置為有效值my_customer.s3_buckets.file_transfer_bucket
設置為 Nonemy_customer.s3_buckets.holding_bucket
設置為 None 有沒有一種方法可以在代碼不崩潰的情況下進行以下測試(並且不使用try / except
塊)?
if s3_buckets.file_transfer_bucket.access_key in my_customer
print("Yes, customer has file transfer bucket access key")
我只是在尋找一種方便的方法來做到這一點。
最簡單的方法是在訪問其access_key
屬性之前測試s3_buckets.file_transfer_bucket
是否為None
的情況:
if s3_buckets.file_transfer_bucket is None:
print('No file transfer bucket')
elif s3_buckets.file_transfer_bucket.access_key in my_customer:
# file_transfer_bucket is guaranteed to not be None
print("Yes, customer has file transfer bucket access key")
您可能認為這很乏味,如果這兩個操作都在一行中“自動”發生,您會更願意。 但是測試需要完成。 否則,您將無法區分if
子句失敗是因為file_transfer_bucket
是None
還是因為它的access_key
不在my_customer
中。
您可以通過實現get_access_key()
方法、使用屬性等在某種程度上“隱藏”此行為。但在某些時候需要完成測試,因為None
是file_transfer_bucket
的有效值——即使它是在內部完成的你的課程。
也許更好的選擇是讓客戶端始終將s3_bucket
實例作為file_transfer_bucket
屬性,並在該存儲桶“無效”時將其access_key
設置為None
- 但只有你知道這一點,因為我們不知道你的代碼是什么正在努力實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.