簡體   English   中英

如何檢查 class 是否具有其他類的屬性

[英]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_bucketencryption_bucket

當客戶沒有存儲桶時,該屬性將由另一個初始化my_customer的 function 設置為None

因此,例如, my_customer的實例可能具有:

  • my_customer.s3_buckets.encryption_bucket設置為有效值
  • my_customer.s3_buckets.file_transfer_bucket設置為 None
  • my_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_bucketNone還是因為它的access_key不在my_customer中。

您可以通過實現get_access_key()方法、使用屬性等在某種程度上“隱藏”此行為。但在某些時候需要完成測試,因為Nonefile_transfer_bucket的有效值——即使它是在內部完成的你的課程。

也許更好的選擇是讓客戶端始終將s3_bucket實例作為file_transfer_bucket屬性,並在該存儲桶“無效”時將其access_key設置為None - 但只有你知道這一點,因為我們不知道你的代碼是什么正在努力實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM