استخدام locale.setlocale في لغة Python المضمنة دون كسر تحليل الملف في مؤشر ترابط C

StackOverflow https://stackoverflow.com/questions/140295

سؤال

نحن نستخدم منتج وسيط تابع لجهة خارجية يسمح لنا بكتابة التعليمات البرمجية في مترجم Python المضمن، والذي يكشف عن واجهة برمجة التطبيقات (API) التي يمكننا الاتصال بها.تسمح لنا بعض استدعاءات واجهة برمجة التطبيقات هذه بتحميل أنواع مختلفة من الملفات، ويتم تنفيذ كود التحميل في لغة C.يتم تحميل الملف في سلسلة منفصلة، ​​ثم يتم الاتصال مرة أخرى ببايثون عندما تكون البيانات متاحة.حتى الآن، كل شيء جيد ومدهش.

لقد قمنا بتصنيع منتجنا، والشيء الوحيد الذي نود القيام به هو تنسيق الإخراج الرقمي الذي يواجه المستخدم وفقًا لإعدادات الإعدادات المحلية للمستخدم.لذلك، من بايثون، نفعل هذا:

import locale
locale.setLocale( locale.LC_ALL, '' )

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

لا يمكننا حل هذه المشكلة عن طريق تنفيذ تحميل ملف مدرك للغة، لذا فإن الحل البديل الحالي لدينا هو تعيين اللغة فقط عند تنسيق الإخراج للمستخدم، ثم إعادة تعيينها مرة أخرى بعد ذلك.أي شيء مثل:

import locale
currentLocale = locale.getLocale( locale.LC_ALL )
locale.setLocale( locale.LC_ALL, '' )
displayNumbersToTheUser()
locale.setlocale( locale.LC_ALL, currentLocale )

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

نقدر أي معلومات حول أفضل الممارسات - ليس لدي خبرة كبيرة في هذا النوع من الأشياء.

هل كانت مفيدة؟

المحلول

قد يؤدي تعيين الإعدادات المحلية بعد بدء تشغيل مؤشرات ترابط متعددة إلى نتائج غير متوقعة.ما لم أتمكن من اكتشاف طريقة أكثر دقة، فمن المحتمل أن أقوم بتقسيم تحميل الملف وواجهة المستخدم إلى عمليات منفصلة، ​​والتواصل عبر أنبوب أو مقبس ملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top