العامل ** في بايثون سياقي أو يعتمد على ما يتم استخدامه معه؛ عند استخدامه مع الأرقام (عادةً بين رقمين)، فإنه يعمل بمثابة عامل الأس. ولكن في هذه المقالة سوف ننظر في سياق آخر يتم استخدامه. سننظر في استخدامه باعتباره عامل تفريغ، يستخدم لتفريغ قواميس بايثون.
لابد أن أي شخص قام بالبرمجة بلغة بايثون قد شاهد **kwargs. اختصار لوسائط الكلمات الرئيسية. وهي عبارة عن وسيطات تم تمريرها إلى الوظائف في بناء جملة المفتاح = القيمة. يتم استخدام kwargs عندما لا نعرف عدد وسائط الكلمات الرئيسية التي سيتم تمريرها إلى وظيفتنا. **kwargs هو نوع قاموس وهو جيد مثل تمرير قاموس إلى دالة. يحتوي هذا القاموس على:
وفقًا لهذا المنطق، في هذه المقالة، سننظر في حالات الاستخدام الخاصة به في Python وصولاً إلى حالة الاستخدام الخاصة به في FastAPI مع فئات Pydantic.
سيتم النظر في النقاط التالية.
ملاحظة: استخدام kwargs ليس إلزاميًا، يمكنك استخدام أي اصطلاح تسمية آخر على سبيل المثال. **myArgs، **أي شيء وما إلى ذلك.
في هذا المثال، سيكون لدينا عدد من وسيطات الكلمات الرئيسية التي تم تمريرها إلى دالة باسم **kwargs وبما أن **kwargs عبارة عن قاموس، فسوف نستخدم طريقة القاموس .items() عليه. يقوم الأسلوب .items() بإرجاع كائن عرض يعرض قائمة بأزواج صف المفاتيح والقيمة في القاموس.
def print_details(**kwargs): # kwargs is a dictionary containing all keyword arguments print(type(kwargs)) # Output:print(kwargs.items()) # Displays the dictionary items (key-value pairs) # Iterate over the key-value pairs in kwargs for key, value in kwargs.items(): print(f"{key}: {value}") # Calling the function with multiple keyword arguments print_details(name="Stephen", age=30, profession="Software Developer")
الإخراج
dict_items([('name', 'Stephen'), ('age', 30), ('profession', 'Software Developer')]) name: Stephen age: 30 profession: Software Developer
كما لاحظنا، فإن فئات بايثون قابلة للاستدعاء؛ وهذا يعني أنه يمكننا استدعاء فئة بنفس الطريقة التي نسميها وظيفة. يؤدي استدعاء فئة إلى إنشاء مثيل (كائن) لتلك الفئة.
class Tech: def __init__(self, dev, devops, design): self.dev = dev self.devops = devops self.design = design # Call class to create an instance tech = Tech(dev, devops, design)
سيؤدي استدعاء Tech بقيم الوسيطات إلى إرجاع تقنية المثيل.
في الفئات، يقوم عامل التشغيل ** بفك القاموس مما يسمح بتمرير كل زوج من المفاتيح والقيمة كوسيطة مسماة إلى مُنشئ الفئة.
في المثال الخاص بهذا القسم، قمنا بتعريف فئة. نحدد قاموسًا بخصائص تطابق معلمات الفصل. نقوم بعد ذلك بإنشاء مثيل للفئة، باستخدام ** لتفريغ القاموس.
class Tech: def __init__(self, dev, devops, design): self.dev = dev self.devops = devops self.design = design # Define a dictionary with properties matching the class's parameters tech_team = { 'dev': 'Stephen', 'devops': ['Jenny', 'Rakeem', 'Stanley'], 'design': 'Carlos' } # Create an instance of the class using ** to unpack the dictionary tech = Tech(**tech_team) print(tech.dev) print(tech.devops) print(tech.design)
الرمز أعلاه يعادل:
class Tech: def __init__(self, dev, devops, design): self.dev = dev self.devops = devops self.design = design # Define a dictionary with properties matching the class's parameters tech_team = { 'dev': 'Stephen', 'devops': ['Jenny', 'Rakeem', 'Stanley'], 'design': 'Carlos' } # Create an instance of the class tech = Tech( dev = tech_team["dev"], devops = tech_team["devops"], design = tech_team["design"] ) print(tech.dev) print(tech.devops) print(tech.design)
وهذا بسبب:
tech = Tech(**Tech_team)
مثل:
tech = Tech( dev = tech_team["dev"], devops = tech_team["devops"], design = tech_team["design"] )
Pydantic هي مكتبة Python تستخدم للتحقق من صحة البيانات، حتى أنها توصف بأنها مكتبة التحقق من صحة البيانات الأكثر استخدامًا لـ Python، وذلك باستخدام نظام تلميحات النوع Python3. يساعدنا Pydantic المستخدم في FastAPI على تحديد نماذج البيانات التي تعتبر فئات بعبارات بسيطة.
في فصولنا، يمكننا تحديد أنواع لسماتنا أو حقولنا، على سبيل المثال str، int، float، List. عندما يتم توفير البيانات، يتحقق Pydantic للتأكد من مطابقتها.
بالإضافة إلى ذلك، يساعد Pydantic في التحليل والتسلسل. التسلسل هو عملية نقل كائنات البيانات إلى تنسيق قابل للنقل بسهولة؛ على سبيل المثال، كائن أو مصفوفة بتنسيق JSON لبساطته وسهولة تحليله.
يحتوي Pydantic على فئة BaseModel التي ترث منها الفئات المحددة. فيما يلي مثال لنموذج Pydantic:
from pydantic import BaseModel, EmailStr # We import the BaseModel and Emailstr type from Pydantic class UserInDB(BaseModel): username: str hashed_password: str email: EmailStr full_name: Union[str, None] = None
لنفترض أن لدينا:
class Item(BaseModel): name:str price:float app = FastAPI() @app.post("/items/") async def create_item(item:Item): return item
في الكود أعلاه، العنصر الذي يمثل معلمة نص الطلب، هو مثيل لنموذج العنصر. يتم استخدامه للتحقق من صحة نص طلب JSON الوارد وإجراء تسلسل له للتأكد من مطابقته للبنية المحددة في نموذج العنصر.
تحتوي نماذج Pydantic على طريقة .dict() والتي تقوم بإرجاع قاموس يحتوي على بيانات النموذج.
إذا قمنا بإنشاء مثيل نموذج pydantic:
item = Item(name="sample item", price=5.99)
ثم نستدعي dict() معه:
itemDict = item.dict() print(itemDict)
لدينا الآن قاموس وستكون مخرجاتنا:
{ "name": "sample item", "price":5.99 }
لاحظ أن:
Item(name="sample item", price=5.99)
يعادل
# Using the unpacking operator Item(**itemDict) # Or Item( name=itemDict["name"], price=itemDict["price" )
سننظر الآن في بعض المواقف التي يكون فيها استخدام عامل التفريغ مفيدًا.
original_dict = {"name": "Stephen", "age": 30, "profession": "Software Developer"} # Creating a new dictionary with additional or modified entries new_dict = {**original_dict, "age": 31, "location": "New York"} print(new_dict)
default_config = {"theme": "light", "notifications": True} user_config = {"theme": "dark"} # Merging dictionaries using unpacking final_config = {**default_config, **user_config} print(final_config)
عامل تفريغ القاموس ** هو أحد العوامل التي يجب مراعات استخدامها نظرًا لطبيعته الديناميكية في التعامل مع الوسائط في الوظائف والفئات، وفي دمج وإنشاء قواميس جديدة. كل هذه الأمور مجتمعة تؤدي إلى كود أقل وصيانة أفضل للكود.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3