6

PROSS.py を編集して、タンパク質構造の .cif ファイルを操作しています。既存の PROSS.py 内には、.py ファイル内に存在する次の関数があります (クラスに関連付けられていない場合、それが正しい名前だと思いますか?)。

...
def unpack_pdb_line(line, ATOF=_atof, ATOI=_atoi, STRIP=string.strip):
...
...
def read_pdb(f, as_protein=0, as_rna=0, as_dna=0, all_models=0,
    unpack=unpack_pdb_line, atom_build=atom_build):

コマンド ライン引数の optons パーサーを追加しています。オプションの 1 つは、unpack_pdb_line 以外に使用する別の方法を指定することです。したがって、オプションパーサーの関連部分は次のとおりです。

...
parser.add_option("--un", dest="unpack_method", default="unpack_pdb_line", type="string", help="Unpack method to use. Default is unpack_pdb_line.")
...
unpack=options.unpack_method

ただし、options.unpack_method は文字列であるため、options.unpack_method 内の文字列と同じ名前の関数を使用する必要があります。getattr などを使用して文字列を実際の関数名に変換するにはどうすればよいですか?

ありがとう、

ポール

4

5 に答える 5

8

通常、dict と store の(func_name, function)ペアを使用するだけです。

unpack_options = { 'unpack_pdb_line' : unpack_pdb_line,
                   'some_other' : some_other_function }

unpack_function = unpack_options[options.unpack_method]
于 2009-11-15T20:24:01.897 に答える
2

vars()["unpack_pdb_line"]()も機能します。

また

globals() または locals() も同様に機能します。

>>> def a():return 1
>>>
>>> vars()["a"]
<function a at 0x009D1230>
>>>
>>> vars()["a"]()
1
>>> locals()["a"]()
1
>>> globals()["a"]()
1

乾杯、

于 2009-11-19T05:51:37.637 に答える
1
function = eval_dottedname(name if '.' in name else "%s.%s" % (__name__, name))

どこでeval_dottedname()

def eval_dottedname(dottedname):
    """
    >>> eval_dottedname("os.path.join") #doctest: +ELLIPSIS
    <function join at 0x...>
    >>> eval_dottedname("sys.exit") #doctest: +ELLIPSIS
    <built-in function exit>
    >>> eval_dottedname("sys") #doctest: +ELLIPSIS
    <module 'sys' (built-in)>
    """
    return reduce(getattr, dottedname.split(".")[1:],
                  __import__(dottedname.partition(".")[0]))

eval_dottedname()''datetime.datetime.now' など、複数のドットを含む任意の名前をサポートするすべての回答の中で唯一のものです。インポートが必要なネストされたモジュールでは機能しませんが、そのようなモジュールの stdlib の例さえ思い出せません。

于 2009-11-15T22:14:53.530 に答える