我不会考虑让一个库从我当前的路径或模块中导入好的样式。相反,我只希望库从两个地方导入:
-
从全局模块空间进行绝对导入,就像您使用
pip
。如果库执行此操作,则还必须在其
install_requires=[]
列表
-
从内部的相对导入。如今,这些都是从
.
:
from . import bla
from .bla import blubb
这意味着必须始终显式地将本地对象或模块传递到当前作用域:
from . import scenarios
import framework
scenarios.sprites # attribute exists
game = framework.Game(scenarios=scenarios)
这允许您进行模拟
scenarios
模块:
import types
import framework
# a SimpleNamespace looks like a module, as they both have attributes
scenarios = types.SimpleNamespace(sprites='a', textures='b')
scenarios.sprites # attribute exists
game = framework.Game(scenarios=scenarios)
还可以实现
framework.utils.Scenario()
实现某个接口以提供
sprites
,则,
maps
等等。原因是:精灵和贴图通常保存在单独的文件中:
你绝对不想做的事
就是看看
场景
的
__file__
属性,并开始在其文件中进行猜测。相反,实现一个方法,该方法提供了一个统一的接口。
class Scenario():
def __init__(self):
...
def sprites(self):
# optionally load files from some default location
# If no such things as a default location exists, throw a NotImplemented error
...
您的特定于用户的场景将从中派生出来,并可以选择重载加载方法
import framework.utils
class Scenario(framework.utils.Scenario):
def __init__(self):
...
def sprites(self):
# this method *must* load files from location
# accessing __file__ is OK here
...
你能做的就是
framework
自己发货
framework.contrib.scenarios
案例编号中使用的模块
scenarios=
使用了关键字arg(即,对于方形默认贴图和一些彩色默认纹理)
from . import contrib
class Game()
def __init__(self, ..., scenarios=None, ...):
if scenarios is None:
scenarios = contrib.scenarios
self.scenarios = scenarios