Namedtuple في بايثون

تدعم بايثون نوعًا من قاموس الحاويات يسمى "" اسمهtuple() 'موجود في الوحدة' مجموعات '. سنرى في هذه المقالة كيفية إنشاء NameTuple والعمليات على NamedTuple.

ما هو NamedTuple في بايثون؟

في بايثون NamedTuple موجود داخل ملف وحدة المجموعات . فهو يوفر طريقة لإنشاء بنيات بيانات بسيطة وخفيفة الوزن مشابهة لفئة ما ولكن دون تحمل تكاليف تعريف فئة كاملة. مثل القواميس، تحتوي على مفاتيح مجزأة إلى قيمة معينة. على العكس من ذلك، فهو يدعم كلاً من الوصول من قيمة المفتاح وتكرار الوظيفة القواميس نقص.

بايثون NamedTuple بناء الجملة

اسمهtuple(اسم الحقل field_names)

  • typename - اسم المجموعة المسماة.
  • field_names - قائمة السمات المخزنة في المجموعة المسماة.

مثال: يظهر تنفيذ التعليمات البرمجية لـ NamedTuple في بايثون .

Python
   # Python code to demonstrate namedtuple()   from   collections   import   namedtuple   # Declaring namedtuple()   Student   =   namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using index   print  (  'The Student age using index is : '     end  =  ''  )   print  (  S  [  1  ])   # Access using name   print  (  'The Student name using keyname is : '     end  =  ''  )   print  (  S  .  name  )   

الإخراج
The Student age using index is : 19 The Student name using keyname is : Nandini  

العمليات على NamedTuple

فيما يلي العمليات التالية التي يمكن إجراؤها باستخدام nametuple():

  • إنشاء NameTuple
  • عمليات الوصول
  • عمليات التحويل
  • عمليات إضافية

إنشاء NameTuple في بايثون

يؤدي هذا إلى إنشاء فئة مسماة جديدة باستخدام الدالة المسماة () من مجموعات وحدة. الوسيطة الأولى هي اسم الفئة الجديدة والوسيطة الثانية هي قائمة بأسماء الحقول.

Python
   from   collections   import   namedtuple   Point   =   namedtuple  (  'Point'     [  'x'     'y'  ])   p   =   Point  (  x  =  1     y  =  2  )   print  (  p  .  x     p  .  y  )   

الإخراج
1 2  

عمليات الوصول

توفر Namedtuples في Python طرقًا ملائمة للوصول إلى حقولها. فيما يلي بعض عمليات الوصول المتوفرة في Python لـ NamedTuple:

  • الوصول عن طريق الفهرس
  • الوصول عن طريق الاسم الرئيسي
  • الوصول باستخدام getattr()

الوصول عن طريق الفهرس

يتم ترتيب قيم سمات nametuple() ويمكن الوصول إليها باستخدام رقم الفهرس على عكس القواميس التي لا يمكن الوصول إليها عن طريق الفهرس. في هذا المثال نقوم بالوصول إلى بيانات الطالب باستخدام الفهرس.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using index   print  (  'The Student age using index is : '     end  =  ''  )   print  (  S  [  1  ])   

الإخراج
The Student age using index is : 19  

الوصول عن طريق الاسم الرئيسي

يُسمح أيضًا بالوصول عن طريق الاسم الرئيسي كما هو الحال في القواميس. في هذا المثال نستخدم keyname للوصول إلى اسم الطالب.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using name   print  (  'The Student name using keyname is : '     end  =  ''  )   print  (  S  .  name  )   

الإخراج
The Student name using keyname is : Nandini  

الوصول باستخدام getattr()

هذه طريقة أخرى للوصول إلى القيمة من خلال إعطاء القيمة المسماة وقيمة المفتاح كوسيطة لها. في هذا المثال نستخدم getattr() للوصول إلى معرف الطالب في المجموعة المسماة المحددة.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using getattr()   print  (  'The Student DOB using getattr() is : '     end  =  ''  )   print  (  getattr  (  S     'DOB'  ))   

الإخراج
The Student DOB using getattr() is : 2541997  

عمليات التحويل

توفر Namedtuples بعض عمليات التحويل المفيدة للعمل مع أنواع البيانات الأخرى بايثون . فيما يلي عمليات التحويل التالية التي يتم توفيرها للمجموعات المسماة في Python:

  • باستخدام _make()
  • باستخدام _asdict()
  • باستخدام ** (نجمة مزدوجة) عامل التشغيل

التحويل باستخدام _make()

تُستخدم هذه الدالة لإرجاع أ nametuple() من التكرار مرت كحجة. في هذا المثال، نستخدم _make() لتحويل القائمة 'li' إلى مجموعة مسماة.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # initializing iterable   li   =   [  'Manjeet'     '19'     '411997'  ]   di   =   {  'name'  :   'Nikhil'     'age'  :   19     'DOB'  :   '1391997'  }   # using _make() to return namedtuple()   print  (  'The namedtuple instance using iterable is : '  )   print  (  Student  .  _make  (  li  ))   

الإخراج
The namedtuple instance using iterable is : Student(name='Manjeet' age='19' DOB='411997')  

عملية التحويل باستخدام _asdict()

ترجع هذه الوظيفة ال أمرديرديكت () كما تم إنشاؤها من القيم المعينة لـ nametuple(). في هذا المثال، نستخدم _asdict() لتحويل قائمة الإدخال إلى مثيل مسمى.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # initializing iterable   li   =   [  'Manjeet'     '19'     '411997'  ]   # initializing dict   di   =   {  'name'  :   'Nikhil'     'age'  :   19     'DOB'  :   '1391997'  }   # using _asdict() to return an OrderedDict()   print  (  'The OrderedDict instance using namedtuple is : '  )   print  (  S  .  _asdict  ())   

الإخراج
The OrderedDict instance using namedtuple is : OrderedDict([('name' 'Nandini') ('age' '19') ('DOB' '2541997')])  

استخدام عامل التشغيل "**" (نجمة مزدوجة).

تُستخدم هذه الوظيفة لتحويل القاموس إلى المسمى () . في هذا المثال نستخدم '**' لتحويل قائمة الإدخال إلى مجموعة مسماة.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # initializing iterable   li   =   [  'Manjeet'     '19'     '411997'  ]   # initializing dict   di   =   {  'name'  :   'Nikhil'     'age'  :   19     'DOB'  :   '1391997'  }   # using ** operator to return namedtuple from dictionary   print  (  'The namedtuple instance from dict is : '  )   print  (  Student  (  **  di  ))   

الإخراج
The namedtuple instance from dict is : Student(name='Nikhil' age=19 DOB='1391997')  

عمليات إضافية 

هناك بعض العمليات الإضافية التي يتم توفيرها في بايثون بالنسبة إلى NamedTuples:

  • _fields
  • _يستبدل()
  • __جديد__()
  • __getnewargs__()

_fields

يتم استخدام سمة البيانات هذه للحصول على جميع الأسماء الرئيسية من مساحة الاسم المعلنة. في هذا المثال، نستخدم _fields للحصول على جميع الأسماء الرئيسية لمساحة الاسم المعلنة.

Python
   import   collections   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # using _fields to display all the keynames of namedtuple()   print  (  'All the fields of students are : '  )   print  (  S  .  _fields  )   

الإخراج
All the fields of students are : ('name' 'age' 'DOB')  

_يستبدل()

_replace() يشبه str.replace() ولكن الأهداف المسماة الحقول (لا تعدل القيم الأصلية). في هذا المثال نستخدم _replace() لاستبدال اسم من 'Nandini' إلى 'Manjeet'.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # ._replace returns a new namedtuple    # it does not modify the original   print  (  'returns a new namedtuple : '  )   print  (  S  .  _replace  (  name  =  'Manjeet'  ))   

الإخراج
returns a new namedtuple : Student(name='Manjeet' age='19' DOB='2541997')  

__جديد__()

تقوم هذه الوظيفة بإرجاع مثيل جديد لفئة الطالب عن طريق أخذ القيم التي نريد تعيينها للمفاتيح الموجودة في المجموعة المسماة. في هذا المثال نستخدم __new__() لإرجاع مثيل جديد لفئة الطالب.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Student.__new__ returns a new instance of Student(nameageDOB)   print  (  Student  .  __new__  (  Student    'Himesh'    '19'    '26082003'  ))   

الإخراج
Student(name='Himesh' age='19' DOB='26082003')  

__getnewargs__()

تقوم هذه الدالة بإرجاع الصف المسمى كصف عادي. في هذا المثال نحن نفعل الشيء نفسه باستخدام __getnewargs__().

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   H  =  Student  (  'Himesh'    '19'    '26082003'  )   # .__getnewargs__ returns the named tuple as a plain tuple   print  (  H  .  __getnewargs__  ())   

الإخراج
('Himesh' '19' '26082003')  
  1. التحولية : يمكن أن تكون مثيلات الفصل قابلة للتغيير أو غير قابلة للتغيير بينما namedtuple الحالات غير قابلة للتغيير.
  2. طُرق : يمكن أن تحتوي الفئات على طرق (وظائف) بينما namedtuple يوفر في المقام الأول طريقة لتخزين البيانات مع الحقول المسماة.
  3. الميراث : تدعم الفئات الميراث مما يسمح بإنشاء تسلسلات هرمية معقدة namedtuple لا يدعم الميراث.

ما هو الفرق بين الإملاء المكتوب وnametuple؟

  1. فحص النوع : TypedDict (من typing الوحدة النمطية) توفر تلميحات الكتابة للقواميس التي تحتوي على أزواج قيمة مفتاح محددة مفيدة للتحقق من النوع. namedtuple لا يوفر تلميحات النوع.
  2. التحولية : TypedDict المثيلات قابلة للتغيير مما يسمح بإجراء تغييرات على القيم أثناء namedtuple الحالات غير قابلة للتغيير.
  3. بناء : TypedDict يستخدم لتحديد بنية القواميس بأنواع محددة لكل مفتاح بينما namedtuple يوفر حقولًا مسماة للبيانات المشابهة للصفوف.