1

別のファイルの関数に多くの変数を渡すにはどうすればよいですか?

一部のファイルには機能しかないことに気づきました(それらは個々のファイルにグループ化されています)。たとえば、インストールを制御する1つのファイル(新規インストール、更新インストールなどの機能を持つ)、アクセスを許可する別のファイル(新しいユーザーの作成、ユーザーの削除、ユーザーの更新など)。これらの関数は、かなりの量の変数を受け取ります。 、例として:

access_tool.add_user(cur,con,env,family,iserver,version,login,
                           password,prefix,proxyUser,proxyPass,
                           proxyServer,user,pass)

したがって、access_tool(ファイル)と関数(get_add_info)は、別のファイルからこれらの変数を受け取り、それらの変数は動的です(データベースクエリの結果)。これらの値を別のファイルの関数にエレガントに渡すにはどうすればよいですか?

例:

2つの重要なファイルがあります。

  1. a.properties-データベース情報とクレデンシャルが含まれています
  2. mainfile.py-メインファイル。たとえば、関数を実行するために呼び出されます。
    • add-user ENV newuser newuserpass

add-userは、add_userというファイルaccess_tool.pyから関数を呼び出します。

mainfile.pyが行うことは(このユーザー作成の例では)入力を介して送信される環境に応じて、データベースにクエリを実行してユーザーを追加するXサーバーを選択し、結果をvarsに格納します(配列ループに使用される):

cur,con,env,family,iserver,version,login,password,prefix,proxyUser,proxyPass,proxyServer

したがって、これらの変数は、追加する5、10、またはそれ以上のサーバーをループから受け取ります。静的な変数はnewuserとnewuserpass(入力から受け取る)のみです。

私が抱えている唯一の問題は、変数を別のファイルの関数に渡す(または共有する)方法を決定することです。

仕事関係者の中には、すべてを同じファイルに保存し、クラスごとに多くのファイルを用意する代わりに、すべてのクラスを1つのファイルにまとめることを提案する人もいます。

4

3 に答える 3

2

Pythonのファイルの概念はあいまいです。「ファイルからの変数」というフレーズは何の意味もありません。これらの変数がどのようにインスタンス化されるか、およびそれらのスコープは何かを知っておく必要があります。

Pythonの値はファイルには存在せず、メモリに存在し、変数によって示されます。

多くのパラメーターを受け取る関数の場合、名前付き引数を使用するのが一般的です。

def fun(**args):
  param1 = args.get('param1', 'default_value')
  param2 = ... # etc

fun(param1='val1', param2 = 'val2')

あなたが探しているエレガンスかもしれません:)

したがって、コードは次のようになります。

def main():
  #initialization 
  import access_tool
  con = database_connection()
  servers = query_database_for_servers()

  for server in servers:
    #assume server is a dict of values
    access_tool.add_user ( **server )

そして、あなたのadd_user関数はこのように変更されるかもしれません:

def add_user ( **params ):
   # connect to params['server'] using params['env']
   # and add user with other params[]
于 2012-10-02T12:26:47.400 に答える
0

これは、値の保存方法によって異なります。たとえば、構成ファイルから読み取られ、構成値をディクショナリとして格納する場合は、ディクショナリアンパックを使用して、値をメソッド呼び出しに渡すことができます。例えばaccess_tool.add_user(**settings)

于 2012-10-02T12:22:56.217 に答える
0

多くの関数間で変数を渡したい場合は、オブジェクトの受け渡しを確認することをお勧めします。 ここで私の答えを参照してください:。さらに複雑なことをしたい場合は、モジュールConfigParserを確認する必要があります。

于 2012-10-02T12:24:06.790 に答える