Python3
答えを見つけようとしましたが、失敗しました。最初にスニペットを提示し、次になぜこのようにしたかったのか、何を達成したかったのかを説明します。たぶん、このアプローチは「悪いもの」のように見えるでしょう。したがって、この半二重のトピックは、最初にこのスニペットが機能しない理由を知りたいのですが、2 番目に、このアプローチが正しいかどうかを知りたいのです。
そう:
class Namespace:
def some_function():
pass
class SomeClass:
fcnt = some_function
これは次の理由で機能しません:
NameError: name 'some_function' is not defined
私が達成したいのは、コードとファイル構造の読みやすさです。
上記の例は、私が Pyramid プロジェクトで使用するスニペットです (これではなく、このように見えます)。
私のプロジェクトツリーは次のようになります。
my_project
├── models
│ ├── __init__.py
│ └── some_model.py
├── schemas
│ ├── __init__.py
│ ├── some_schema.py
│ └── some_other_schema.py
...
├── views
│ ├── __init__.py
│ └── some_view.py
└── __init__.py
私が達成したかったのは、クリーンなスキーマ/モデル/ビューのインポートです。
some_schema.pyファイルはsome_other_schema.pyにありclass SomeSchema
ます。 class SomeOtherSchema
上記のスニペットを使用すると、次のことができます。
from my_project.schemas.some_schema import Schema
そしてそれを次のように使用しますSchema.SomeSchema()
import
パッケージとsについて少し迷っています。クリーンな構造 (ファイルごとに 1 つのスキーマ) を作成し、それでもスキーマ名前空間を使用できるようにするにはどうすればよいでしょうか? (C++ では、これらのクラスのそれぞれをSchema
名前空間に配置するだけでした。そのため、上記のスニペットでこれを行いました。しかし! C++ で機能するものは、Python では使用しないでください。)
事前に回答いただきありがとうございます。
編集: わかりました、私はいくつかのテストを行いました(私はそれをやったと思っていましたが、そうではないようです..)。
from my_project.schemas.some_schema import Schema
2番目のインポートで別のfrom my_project.schemas.some_other_schema import Schema
原因と一緒に使用すると、最初のインポートがシャドウイングされます。したがって、最初のインポート後に使用できる場合は、2 回目のインポートよりも優先x = Schema.SomeSchema()
されるため、これを行うことはできません。class Schema
そうです、Erik が言ったように、クラスは名前空間ではありません。とった!私の最初のスニペットでは、はい、使用する必要がありました
fnct = Namespace.some_function
。奇妙なこと - それは動作します。私のピラミッド コードにも同じステートメントがありますが、1 つの違いがあります。デコレータsome_function
を持っています。@colander.deferred
実際には、次のようになります。class Schema: @colander.deferred def deferred_some_function(node, kw): something = kw.get("something", []) return deform.widget.SelectWidget(values=something, multiple=True) class SomeSchema(colander.MappingSchema): somethings = colander.SchemaNode(colander.Set(), widget=Schema.deferred_some_function)
そして、私は得る
NameError: name 'Schema' is not defined
パッケージ形式に戻ります。これとともに:
### another/file.py from foo.bar.schema import SomeSchema # do something with SomeSchema: smth = SomeSchema() smth.fcnt()
foo/bar/schema.py
すべてのSomeXSchema
クラスを配置する必要があるモジュールを 1 つ作成する必要があります。私がそれらをたくさん持っている場合、ファイルごとに1つずつ、SomeXSchemaを分割することで取り除きたいと思っていた読み取り不能なグリッチがあります。どうにかしてこれを達成できますか?たとえば、このクラスを呼び出したい:User
. そして、これがTHINGです。多分私はそれを間違っていますか?名前空間で名前が付けられたクラスと名前空間User
で名前が付けられたクラスが必要です。私はすべきではないですか?たぶん、プレフィックスを使用する必要がありますか?のように?モジュール/パッケージを使用して回避したかったのです。: を使用する場合は、次のように使用する必要があります。のように使う方法はありません。schema
User
model
class SchemaUser
class ModelUser
import foo.bar.schema
x = foo.bar.schema.User()
x = schema.User()
? 申し訳ありませんが、私は行き詰まってしまいました。私の脳は修正されました。新鮮な表情を見せるために、少し休憩が必要なのかもしれません。別の編集 (ポイント 3 のみ)
さらに調査を行いました。ここでの答えは、次のようにすることです。
## file: myproject/schemas/__init__.py from .some_schema import SomeSchema from .some_other_schema import SomeOtherSchema
使用法は次のようになります。
## some file using it import myproject.schemas as schema s1 = schema.SomeSchema() s2 = schema.SomeOtherSchema()
それはlege artisでしょうか?
誰かがそのトピックを変更する必要があると考えている場合は、どうぞ、もっと意味のあることを教えてください。