Python3
试图找到答案但失败了。首先,我将展示这个片段,然后我将解释我为什么要这样做以及我想要实现的目标。也许它看起来像这种方法是“坏的”。因此,这个半双主题,首先我想知道为什么这个片段不起作用,其次 - 我想知道这种方法是否正确。
所以:
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文件class SomeSchema
中,在some_other_schema.py class SomeOtherSchema
中。
使用上面的代码片段,我可以制作:
from my_project.schemas.some_schema import Schema
并像使用它一样Schema.SomeSchema()
import
我对包裹和s有点迷茫。如何制作一个干净的结构(每个文件一个模式)并且仍然能够使用 Schema 命名空间?(在 C++ 中,我只是将这些类中的每一个放在Schema
命名空间中,这就是我在上面的代码片段中这样做的原因。但是!在 C++ 中有效的东西可能不应该在 python 中使用,对吧?)。
感谢您提前回答。
编辑: 好的,我已经做了一些测试(我以为我已经完成了,但看起来没有..)。
- 在第二个导入阴影中使用
from my_project.schemas.some_schema import Schema
另一个原因。from my_project.schemas.some_other_schema import Schema
因此,如果在第一次导入之后我可以使用x = Schema.SomeSchema()
而不是在第二次导入之后我将无法执行此操作,因为class Schema
会被覆盖。对,正如 Erik 所说——类不是命名空间。知道了! 在我的第一个片段中是的,我应该使用
fnct = Namespace.some_function
. 有什么奇怪的 - 它有效。我的金字塔代码中有相同的声明,但有一点不同。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
课程。如果我有很多,那么我想通过拆分 SomeXSchema 来消除不可读的故障 - 每个文件一个。我能以某种方式做到这一点吗?我想调用这个类,例如:User
. 事情就是这样。也许我做错了?我想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吗?
如果有人认为应该更改该主题 - 继续,给我一些更有意义的东西,我将不胜感激。