البرمجة

كيفية الوصول إلى عناصر القواميس المتداخلة في Python

عندما تحاول الوصول إلى عنصر معين في قاموس Python باستخدام تعبير متغير مثل json_dict[param]، يجب أن تتأكد من أن قيمة param تُعيد مفتاحًا صحيحًا للقاموس. في حالتك، تحاول الوصول إلى json_dict['OptionSettings'][3]['Value']، والتحدي الذي تواجهه هو كيفية تمرير هذا التعبير كقيمة للمتغير param.

لحل هذه المشكلة، يمكنك استخدام الوظيفة eval() لتقييم التعبير كشيء قابل للتنفيذ. ومع ذلك، يجب استخدام هذه الوظيفة بحذر لأنها يمكن أن تفتح الأبواب أمام ثغرات أمان. هناك طريقة أخرى أكثر أمانًا للقيام بذلك باستخدام وظيفة getattr().

في البداية، يجب أن تحلل السلسلة param للحصول على الأجزاء المنفصلة، ثم تحقق مما إذا كان كل مفتاح موجود في القاموس. في النهاية، تحصل على القيمة المطلوبة.

اليك كود مثالي للتوضيح:

python
json_dict = { "ApplicationName": "Test", "EnvironmentName": "ABC-Nodejs", "CNAMEPrefix": "ABC-Neptune", "SolutionStackName": "64bit Amazon Linux 2016.03 v2.1.1 running Node.js", "OptionSettings": [ { "Namespace": "aws:ec2:vpc", "OptionName": "AssociatePublicIpAddress", "Value": "true" }, { "Namespace": "aws:elasticbeanstalk:environment", "OptionName": "EnvironmentType", "Value": "LoadBalanced" }, { "Namespace": "aws:ec2:vpc", "OptionName": "Subnets", "Value": "param1" }, { "Namespace": "aws:autoscaling:launchconfiguration", "OptionName": "SecurityGroups", "Value": "param2" }, { "Namespace": "aws:autoscaling:asg", "OptionName": "MinSize", "Value": "1" }, { "Namespace": "aws:autoscaling:asg", "OptionName": "MaxSize", "Value": "4" }, { "Namespace": "aws:autoscaling:asg", "OptionName": "Availability Zones", "Value": "Any" }, { "Namespace": "aws:autoscaling:asg", "OptionName": "Cooldown", "Value": "360" }, { "Namespace": "aws:autoscaling:launchconfiguration", "OptionName": "IamInstanceProfile", "Value": "NepRole" }, { "Namespace": "aws:autoscaling:launchconfiguration", "OptionName": "MonitoringInterval", "Value": "5 minutes" }, { "Namespace": "aws:autoscaling:launchconfiguration", "OptionName": "RootVolumeType", "Value": "gp2" }, { "Namespace": "aws:autoscaling:launchconfiguration", "OptionName": "RootVolumeSize", "Value": "10" }, { "Namespace": "aws:elasticbeanstalk:sns:topics", "OptionName": "Notification Endpoint", "Value": "[email protected]" }, { "Namespace": "aws:elasticbeanstalk:hostmanager", "OptionName": "LogPublicationControl", "Value": "false" }, { "Namespace": "aws:elasticbeanstalk:command", "OptionName": "DeploymentPolicy", "Value": "Rolling" }, { "Namespace": "aws:elasticbeanstalk:command", "OptionName": "BatchSizeType", "Value": "Percentage" }, { "Namespace": "aws:elasticbeanstalk:command", "OptionName": "BatchSize", "Value": "100" }, { "Namespace": "aws:elasticbeanstalk:command", "OptionName": "HealthCheckSuccessThreshold", "Value": "Ok" }, { "Namespace": "aws:elasticbeanstalk:command", "OptionName": "IgnoreHealthCheck", "Value": "false" }, { "Namespace": "aws:elasticbeanstalk:command", "OptionName": "Timeout", "Value": "600" }, { "Namespace": "aws:autoscaling:updatepolicy:rollingupdate", "OptionName": "RollingUpdateEnabled", "Value": "false" }, { "Namespace": "aws:ec2:vpc", "OptionName": "ELBSubnets", "Value": "param3" }, { "Namespace": "aws:elb:loadbalancer", "OptionName": "SecurityGroups", "Value": "param4" }, { "Namespace": "aws:elb:loadbalancer", "OptionName": "ManagedSecurityGroup", "Value": "param4" } ] } def access_nested_dict(dictionary, param): keys = param.split('[') for key in keys: if ']' in key: key = key.replace(']', '') if key.isdigit(): key = int(key) dictionary = dictionary[key] return dictionary param = "['OptionSettings'][3]['Value']" try: result = access_nested_dict(json_dict, param) print(result) except KeyError: print("Error: Key not found in dictionary.")

يتم استدعاء الوظيفة access_nested_dict() مع القاموس json_dict والمعامل param الذي يحتوي على المفاتيح التي تحتاج للوصول إليها. الوظيف

المزيد من المعلومات

الوظيفة access_nested_dict() تقوم بتحليل سلسلة param إلى مفاتيح منفصلة، ثم تقوم بالبحث عن كل مفتاح في القاموس. إذا تم العثور على المفتاح، يتم التحقق مما إذا كان مؤشرًا على موقع في القاموس أم قيمة لمفتاح متداخل. النهج هذا يضمن الوصول إلى القيمة المطلوبة في القاموس بشكل ديناميكي.

عند تشغيل الكود، يُطبع البرنامج قيمة Value المطلوبة من القاموس، وفي حالة عدم العثور على المفتاح المطلوب، يُطبع رسالة الخطأ المناسبة.

هذا النهج يسمح لك بالوصول إلى القيم في القواميس بطريقة ديناميكية، مما يتيح لك التعامل مع بيانات متغيرة الهيكل بسهولة، بغض النظر عن عمق التضمين أو تركيب البيانات. ويعتبر هذا النهج أكثر أمانًا من استخدام eval() لتقييم التعبير بأكمله، حيث يمكن أن يؤدي ذلك إلى ثغرات أمان.

باستخدام هذا الكود، يمكنك الآن الوصول بسهولة إلى البيانات المطلوبة في القاموس الخاص بك بطريقة مرنة وآمنة، مما يتيح لك تطبيق العمليات والتحليلات على البيانات بشكل فعال وسلس.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر