كيف يمكنني تمرير الكثير من المتغيرات من وظيفة في الثعبان ؟

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

سؤال

أفعل العلمية برمجة, في كثير من الأحيان تريد أن تظهر للمستخدمين يطالب متغير أزواج ، والسماح لهم تحرير المتغيرات ، ومن ثم القيام calulations مع المتغيرات الجديدة.أفعل هذا في كثير من الأحيان ، التي كتبت wxPython الدرجة لنقل هذه الشفرة من البرنامج الرئيسي.إعداد قائمة لكل متغير مع نوع المتغير (string, تعويم, int), موجه, و المتغير القيمة الحالية.ثم ضع كل هذه القوائم في قائمة واحدة كبيرة و فائدة يخلق بدقة منسقة wxPython الفريق مع المطالبات القيم الحالية والتي يمكن تحريرها.

عندما بدأت لم يكن لدي سوى عدد قليل من المتغيرات ، لذلك أود أن أكتب كل متغير.

s='this is a string'; i=1; f=3.14
my_list=[ ['s','your string here',s], ['i','your int here',i], ['f','your float here'],]
input_panel = Input(my_list)

 # the rest of the window is created, the input_panel is added to the window, the user is
 # allowed to make  choices, and control returns when the user hits the calculate button

s,i,f = input_panel.results()     # the .results() function returns the values in a list

الآن أريد أن استخدام هذا الروتين على الكثير من المتغيرات (10-30), و هذا النهج هو كسر.لا يمكن إنشاء إدخال قائمة إلى وظيفة عبر خطوط متعددة باستخدام القائمة.إلحاق() البيانات.عندما يعود البرمجية من وظيفة ، على الرغم من أنني الحصول على هذه القائمة الضخمة التي تحتاج إلى تفكيك في المتغيرات.هذا من الصعب على إدارة ، و يبدو أنه سوف يكون من السهل الحصول على المدخلات قائمة والإخراج قائمة متزامنة.و أسوأ من ذلك ، يبدو kludgy.

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

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

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

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

المحلول

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

نصائح أخرى

هناك نوعان من خيارات لائقة تتبادر إلى الذهن.

الأول هو استخدام القاموس لجمع جميع المتغيرات في مكان واحد:

d = {}
d['var1'] = [1,2,3]
d['var2'] = 'asdf'
foo(d)

والثاني هو استخدام فئة لحزمة جميع الحجج. هذا يمكن أن يكون بسيطا مثل:

class Foo(object):
    pass
f = Foo()
f.var1 = [1,2,3]
f.var2 = 'asdf'
foo(f)

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

بالنسبة لي، الحل المثالي هو استخدام فئة مثل هذا:

>>> class Vars(object):
...     def __init__(self, **argd):
...             self.__dict__.update(argd)
...
>>> x = Vars(x=1, y=2)
>>> x.x
1
>>> x.y
2

يمكنك أيضا إنشاء قاموس وتمريره مثل هذا:

>>> some_dict = {'x' : 1, 'y' : 2}
>>> #the two stars below mean to pass the dict as keyword arguments
>>> x = Vars(**some_dict)  
>>> x.x
1
>>> x.y
2

يمكنك بعد ذلك الحصول على بيانات أو تغييرها كحتاج إلى أن تكون عند تمريرها إلى وظيفة:

>>> def foo(some_vars):
...     some_vars.z = 3 #note that we're creating the member z
...
>>> foo(x)
>>> x.z
3

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

يمكنك الحصول على نفس التأثير مثل "تمرير حسب المرجع" عن طريق تمرير dict (أو للحصول على راحة النحوية Bunch, ، يرى http://code.activestate.com/recipes/52308/).

إذا كان لديك مجموعة محدودة من هذه الحالات، فيمكنك كتابة وظائف غلاف محددة لكل منها. سيعمل كل غلاف على عمل المبنى وقوائم التفريغ يتم تمرير Taht إلى الوظيفة الداخلية.

  1. أود أن أوصي باستخدام القاموس أو فئة أن تتراكم كل التفاصيل عن المتغيرات
    • القيمة
    • موجه النص
  2. قائمة بتخزين النظام الذي تريده عليها ليتم عرضها
  3. ثم استخدام جيد القديمة التكرار إعداد المدخلات وجمع الناتج

بهذه الطريقة سوف تكون فقط تعديل صغير يمكن التحكم فيها الفرع من القانون مرة.بالطبع يجب أن تغلف كل هذا في الفصل إذا كان الخاص بك مريحة العمل مع الطبقات.

"""Store all variables
"""
vars = {}
"""Store the order of display
"""
order = []

"""Define a function that will store details and order of the variable definitions
"""
def makeVar(parent, order, name, value, prompt):
    parent[name] = dict(zip(('value', 'prompt'), (value, prompt)))
    order.append(name)

"""Create your variable definitions in order
"""
makeVar(vars, order, 's', 'this is a string', 'your string here')
makeVar(vars, order, 'i', 1, 'your int here')
makeVar(vars, order, 'f', 3.14, 'your float here')

"""Use a list comprehension to prepare your input
"""
my_list = [[name, vars[name]['prompt'], vars[name]['value']] for name in order]
input_panel = Input(my_list)

out_list = input_panel.results();
"""Collect your output
"""
for i in range(0, len(order)):
    vars[order[i]]['value'] = out_list[i];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top