الحصول على القاموس المحلي لنطاق الوظيفة فقط في بيثون

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

سؤال

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

المزيد حول سبب رغبتي في القيام بذلك:أنا ألعب مع Django وعندما أذهب لإعطاء سياق القوالب الخاصة بي، فأنا مجبر إما على إنشاء قاموس يدويًا (في انتهاك لمبادئ DRY) أو تمرير locals() الذي يحتوي على المزيد من الإدخالات ثم هناك حاجة إليها (مضيعة) .هل ربما يكون هناك شيء أفتقده في جانغو والذي من شأنه أن يخفف من الحاجة إلى حل على مستوى بايثون؟

للتوضيح:

لذا، فإن الحالة التي ضربتها بشكل متكرر هي حيث لدي:

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return {'var1': val1,'var2':val2} 

لذا بدلاً من تكرار تلك المتغيرات واصطلاحات التسمية، سأفعل:

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return locals() 

وهو الأمر الذي أجده أكثر نظافة، لكنني أعرف أنه نوع من الإهمال نظرًا لوجود حوالي 30 إدخالًا إضافيًا في locals() ثم أحتاجها بالفعل.

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

المحلول

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

def my_view(request):
    context = {}
    context['items'] = Item.objects.all()
    context['anothervalue'] = context['items'][2].name
    return render_to_response('template.html', context)

نصائح أخرى

كيف يعتبر تمرير القاموس انتهاكًا لـ DRY؟ جانغو هو كل شيء عن DRY, ، لذلك أشك في أن السلوك القياسي له سوف ينتهكه بشكل مباشر.ولكن في كلتا الحالتين، أستخدم نسخة معدلة من جانغو-مزعج لتسهيل الأمر برمته:

@render_to('my_template.html')
def myview(request):
    # figure stuff out...
    return {'var1':'val1','var2','val2'}

ال render_to يعتني مصمم الديكور بسياق الطلب وكل تلك الأشياء الجيدة.يعمل بشكل جيد.

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

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

ويجب التركيز على بنية الرمز الذي يعبر عن أفضل نيتك، مع أقل عدد من الاحتمالات للخطأ. النفايات كنت قلقا من لا شيء يدعو للقلق.

وبينما أنا أتفق مع الكثير من المجيبين الأخرى التي تمر إما locals() أو {'var1':var1, 'var2': var2} ديكت محدد تماما هو الأكثر احتمالا OK، إذا كنت تريد على وجه التحديد إلى "فرعية" لديكت مثل locals() هذا أبعد ما يكون عن الصعب سواء، ومنها مثلا:

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top