문제

나는 과학적 프로그래밍을하고 종종 사용자에게 프롬프트와 가변 쌍을 보여주고 변수를 편집 한 다음 새로운 변수로 캘리포니아를 수행하려고합니다. 나는이 코드를 메인 프로그램에서 옮기기 위해 WXPYTHON 클래스를 썼기 때문에 이것을 자주합니다. 변수 유형 (문자열, float, 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)에 사용하고 싶습니다.이 접근법은 분해되고 있습니다. list.append () 문을 사용하여 여러 줄을 통해 함수에 입력 목록을 만들 수 있습니다. 그러나 코드가 함수에서 반환되면 올바른 변수로 포장을 풀어야하는이 거대한 목록을 얻습니다. 관리하기가 어렵고 입력 목록과 출력 목록을 동기화에서 쉽게 가져 오는 것이 쉽습니다. 그리고 그보다 나쁘게, 그것은 Kludgy처럼 보입니다.

편집 할 수 있도록 추가 정보가 포함 된 많은 변수를 Python의 함수로 전달한 다음 프로그램의 나머지 부분에서 사용할 수 있도록 변수를 다시 가져 오는 가장 좋은 방법은 무엇입니까?

변수를 함수로 참조하여 변수를 전달할 수 있다면 사용자는 변경 여부를 변경할 수 있으며 프로그램이 함수에서 반환되면 값을 사용합니다. 여러 줄을 통해 입력 목록 만 빌드하면되며 출력 목록과 동기화되지 않는 입력 목록의 가능성이 없습니다. 그러나 파이썬은 이것을 허용하지 않습니다.

큰 목록을 작은 목록으로 나누어서 함수로 들어오고 나가기 위해 큰 목록으로 결합되어야합니까? 아니면 오류를 만들기 위해 더 많은 장소를 추가합니까?

도움이 되었습니까?

해결책

가장 간단한 일은 수업을 만드는 것입니다. 변수 목록을 다루는 대신 클래스에는 속성이 있습니다. 그런 다음 클래스의 단일 인스턴스 만 사용합니다.

다른 팁

떠오르는 두 가지 괜찮은 옵션이 있습니다.

첫 번째는 사전을 사용하여 모든 변수를 한 곳에 수집하는 것입니다.

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 (또는 구문 편의를 위해 a 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