1

私は現在、かなり大きな Perl を移植している最中です。問題は、コードをuseing で使用できるようにするために Perl の小さなトリックを使用していることです。Python でもほぼ同じことを行い、コードベースをimporting の 1 つの大きなモジュールにしました。私は長い間 Python についてしっかりと理解してきましたが、内部状態を維持しながらそれ自体の他の部分にアクセスする必要がある Python で書かれた大規模なプロジェクトの経験はありません。

全体を 1 行で単純にインポートすることはまだ試していません ( import core) が、現在、最善の方法で作業を行っていないことはわかっています。以下は、すべてを動かすマスター スクリプトの例です。

self.Benchmark = Benchmark(self)

self.Exceptions = Exceptions

self.Settings = Settings(self)
self.Cache = Cache(self)

self.Deal = Deal(self)
self.Utils = Utils(self)
self.FileParsers = FileParsers(self)
self.Network = Network(self)
self.Plugins = Plugins(self)
self.Misc = Misc(self)

動作しますが、満足していません。現在、マスター クラス スクリプトは、coreモジュールの各部分をインポートし、含まれているクラスのインスタンスを作成し、それらのクラスで自分自身を引数として渡し__init__ます。そのようです:

class FileParsers:
    def __init__(self, parent):
        self.parent = parent

これで、そのクラスのコードは、親クラスを介して残りのコードベース全体にアクセスできるようになります。

self.parent.Settings.loadSysConfig()

私の質問は次のとおりです。上記を考慮して、プロジェクトを再編成し、コードをリファクタリングして、他のすべてにアクセスする現在の機能を保持するための最良の方法は何でしょうか? コードは非常に重要ではないため、内部データの整合性についてはそれほど心配しいません。親クラスをそのような醜い方法で処理する必要があるのは好きではありません。また、これらの長いチェーンもコードの速度を低下させます。

編集:おっと、これらを忘れました:両方のプロジェクトのSVNリポジトリへのリンク。私のものはここにあり、私が移植しているプロジェクトはここにあります。

4

2 に答える 2

1

コードを実際に見ることができないと判断するのは非常に困難ですが、各モジュールが使用するアイテムをそのモジュールにインポートすることを検討する必要があります。インポートの長いリストがあるのは珍しいことではありません - これは私のウェブサイトからの例です:

# standard
import inspect
import linecache
import neo_cgi
import neo_cs
import neo_util
import os
import random
import sys
import time
from _apache import SERVER_RETURN
from mod_python import apache
from mod_python import util
from mod_python.util import FieldStorage
from os.path import dirname, isfile, join, splitext

# set up path
pydir = dirname(__file__)
if pydir not in sys.path:
    sys.path.append(pydir)

# things I wrote
import auth
import handlers.accounts, handlers.publish, handlers.standard
import logger
import markup
import programs
import summarize
from auth import check_auth
from common import hdf_iterate, load_hdf_cgi_vars, load_hdf_common_vars
from common import hdf_insert_value, hdf_insert_list, hdf_insert_dict
from handlers import chain, farm, opt
from handlers import URIPrefixFilter
from handlers.standard import TabBarHandler

そして、より大きなモジュールの多くには、さらに長いリストがあると確信しています。

あなたの場合、Settingsシングルトンオブジェクト(またはモジュールプロパティとしての設定)を持つモジュールを持っている可能性があります

import Settings

または何でも。

于 2009-04-11T01:23:40.797 に答える