我在文件夹foo/中有一个__init__文件,它导入了一些模块
from a import ClassA
from b import *
__all__ = [s for s in dir() if not s.startswith('_')]
我的文件夹foo/包含其他.py文件
foo/
a.py # Contain ClassA
b.py # Contain ClassB
c.py
a导入c,所以当我导入a时,它会自动导入c并将其添加到__init__的locals()作用域中,即使c没有导入到__init__中也是如此。
我希望我的初始化文件的__a
主要目标:在工厂中自动注册类(通过字符串),在运行时使用该字符串动态创建类,类可以在自己的文件中而不是在一个文件中分组。
我有两个类,它们都是从同一个基类继承的,它们将字符串定义为它们的类型。
用户希望获得其中一个类的实例,但只知道在运行时的类型。
因此,我有一个工厂来创建一个给定类型的实例。我不想硬编码一个"if然后语句“,所以我有一个元类来注册基类的所有子类:
class MetaRegister(type):
# we use __init__ rather than __new__ here because we want
# to modify attribu
我已经读过了,我知道它只影响from ... import *语句,但我无法找到真正的用例。为什么我要在__all__中重复导出的名称(DRY!)当我可以简单地避免在__init__命名空间中导入这些名称时呢?
示例:
mypackage/__init__.py
from a import A
mypackage/a.py
A = "A"
A1 = "A1"
mypackage/b.py
B = "B"
然后在蟒蛇中:
>>> from mypackage import *
>>> A
'A
我想知道,__all__文件中的标准位置是什么?
我的假设就在import语句下面。然而,我在任何地方都找不到明确的声明/要求。所以,总的来说,在哪里应该有__all__?
它将放在下面的示例文件中?
#!/usr/bin/env python3
"""Where to put __all__."""
from time import time
# I think it should go here: __all__ = ["Hello"]
SOME_GLOBAL = 0.0
class Hello:
def
我只是注意到了如下的相对导入:
from .foo import myfunc
print myfunc # ok
print foo # ok
同时导入foo和myfunc。这样的行为有记录在案吗?我可以禁用它吗?
--更新
基本上问题是下面的。
bar/foo/__init__.py
__all__ = ['myfunc']
def myfunc(): pass
bar/__init__.py
from .foo import *
# here I expect that there is only myfunc defined
main.py
import foo
我正在使用以下代码在我的模块的__init__.py中填充__all__,我想知道是否有更有效的方法。有什么想法吗?
import fnmatch
import os
__all__ = []
for root, dirnames, filenames in os.walk(os.path.dirname(__file__)):
root = root[os.path.dirname(__file__).__len__():]
for filename in fnmatch.filter(filenames, "*.py"):
__all__.
typing模块将两个类io和re导出为“伪子模块”,如下所示。通过给它们__all__并将它们添加到sys.modules中,使它们看起来像模块的意图是什么?
我理解将它们排除在__all__之外的理由:这样from typing import *就不会掩盖导入的io和re。
但是为什么要将'typing.re'和'typing.io'添加到sys.modules中
来自的片段
import re as stdlib_re
# The pseudo-submodules 're' and 'io' are part of t
我正在做一个大项目,这个项目进口了很多东西。我有用from ... import *导入模块的模块,我希望在这样做的时候避免污染模块级别的变量。
例如:
模块A:
import foobar
def foo():
pass
bar = 10
模块B:
from A import *
# here, foobar is present, but I don't want it to be.
显然,解决方案是使用__all__。所以现在看起来是这样的:
模块A:
import foobar
def foo():
pass
bar = 10
__all__ = [
我有个文件夹
/
alphabet/
__init__.py
a.py
b.py
...
main.py
alphabet/中的模块对我来说必须是未知的,我想在从main.py导入时访问它们,所以这就是alphabet/__init__.py的样子
from os import listdir, path
onlyfiles = [f for f in listdir('alphabet') if path.isfile(path.join("
首先,让我解释一下我要做什么,我想创建一个类,它将从某个目录导入一个文件(如果文件存在的话),并以脚本的形式运行该文件。例如:
class RunScript(object):
def __init(self, script):
if script in someListThatContainsScriptNamesProbablyJSONFile:
self.script = # do something fancy and import the script
def run_exec(self):
# do som
在Python的typing模块中,它们有一个非常有用的常量,即类型检查时的True,而False则不然。例如,这意味着,如果TYPE_CHECKING计算结果为True,则可以动态导入类。
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from module import Class
如果unittest有类似的东西,这将是非常有用的。我可以在__init__.py文件中看到,存在一个定义为__unittest = True的变量
__all__ = ['TestResult', 'TestCase
假设我有一个包"colorExtentions“,在我的__init__.py中有__all__=["red", "blue"]。通过将模块添加到目录和__all__列表,这个包应该能够自动扩展。以下是可接受的,还是有其他的“最佳实践”来处理这类事情?
import colorExtentions
from colorExtentions import *
for moduleName in colorExtentions.__all__:
colors.append(moduleName)
promptUserToChoose(colors)
我希望动态加载放在给定目录(modules)中的所有模块,并在每个模块(.main())中运行特定的方法。 我遇到了以下问题:How to load all modules in a folder? 并以下面的代码结束: my main.py import modules
if __name__ == "__main__":
for module in modules.__all__:
module.main() modules文件夹中的__init__.py如下所示: from os.path import dirname, basename, i