0

ここで説明する少し複雑な問題:

中間値を介して、ある入力を別の入力にマップする関数AB()が必要です。より具体的には、この関数は2つの関数で構成されています。A()とB()を呼び出します。どちらも辞書を返します(つまり、A [B [input]]-> result)

これは私の現在のファイルディレクトリの例です:

packageX/

    __init__.py
    get_part_of_B_expensively.py
    something_that_will_use_convert.py
    convert.py
    packageA/

        __init__.py
        get_the_entirety_of_A_expensively.py

私のconvert.pyには次のものがあります:

import get_part_of_B_expensively
from packageA import get_the_entirety_of_A_expensively
dict_A = packageA.get_the_entirety_of_A_expensively()

def get_B():

    result = {}
    result = get_part_of_B_expensively() # this is a very expensive operation
    result += get_rest_of_B_inexpensively() # shorthand for adding two dictionaries
    return result # returns a dictionary

dict_B = get_B() # hence why i call it once outside, and not inside AB()

def AB(input):
    return dictA[dictB[input]]

get_B()を定義する前にdict_Bを初期化できないため、これが適切であるとは思わないでくださいinput。また、実装を抽象化したいので、AB()の唯一のパラメーターをにしたいと思います。ただし、主にdict_BとdictAなど、いくつかの変数をグローバルに紹介します。それが最善の方法かどうかはわかりません。get_B()を独自のパッケージに分離することはできますが、それでもグローバルフレームのどこかでそれらを呼び出すことになります。これに対するアプローチがどうあるべきかわからないので、A()とB()を呼び出します。これは、同じパッケージ内のファイルを呼び出す)をできるだけ少なくしますが、関数AB()を抽象化します。

4

1 に答える 1

3

これがあなたのモジュールがしているすべてであるならば、私はそれをそのように保つことはそれほど悪いことではないとは言いません。特定のデータを操作するだけの小さなスクリプトの場合、特に読み取り専用として使用している場合は、グローバルを使用しても問題ない場合があります。(グローバルを変更または再バインドする必要がある場合、グローバルに関する多くの紛らわしい問題が発生します。)構成ファイルからロードされたカスタマイズオプションなど、さまざまな種類のグローバルパラメーターを格納するグローバル変数を持つ立派なライブラリがたくさんあります。

より重い状況では、タスクがより複雑な場合、基本的にこれを行うクラスを作成できます。

class Convert(object):
    def __init__(self):
        self.A = packageA.get_the_entirety_of_A_expensively()
        self.B = getB() # or put get_B's code in here
    def AB(self, input):
        return self.A[self.B[input]]

converter = Convert()
converter.AB('blah')

これは、1つのことだけを行う必要がある場合はやり過ぎかもしれませんが、操作をパラメーター化する必要がある場合(たとえば、操作する必要がある可能性のある複数のAおよびBディクテーションがある場合)に進む方法です。

于 2012-06-28T04:59:06.813 に答える