为什么在 "import <module>" 之后使用 "from <module> import <something>"?
Why use "from <module> import <something>" after "import <module>"?
我试图理解为什么在某些代码中,通常的做法是先 导入模块,然后再从模块中导入特定成员 。
import module_a
from module_a import member_a
是否只是出于纯粹的懒惰而不必编写module_a.member_a
而是直接访问member_a
?
这是代码片段我的问题来自:
import spinup
from spinup.utils.run_utils import ExperimentGrid
from spinup.utils.serialization_utils import convert_json
Is it just out of pure laziness to not have to write module_a.member_a
and instead access member_a
directly?
本质上是的,它允许使用 spinup
中的任何函数或 类,以及 spinup.foo
和 spinup.Bar
。大多数时候使用 spinup.foo
方式在主观上更可取,因为这样可以从定义您使用的函数的位置非常清楚。
此技术还允许使用 ExperimentGrid
,而无需在每次使用时指定 spinup.utils.run_utils.ExperimentGrid
。
当使用 type annotations:
时,这对 classes/types 特别有用
def foo(param: ExperimentGrid) -> ExperimentGrid:
比
干净多了
def foo(param: spinup.utils.run_utils.ExperimentGrid) -> spinup.utils.run_utils.ExperimentGrid:
我试图理解为什么在某些代码中,通常的做法是先 导入模块,然后再从模块中导入特定成员 。
import module_a
from module_a import member_a
是否只是出于纯粹的懒惰而不必编写module_a.member_a
而是直接访问member_a
?
这是代码片段我的问题来自:
import spinup
from spinup.utils.run_utils import ExperimentGrid
from spinup.utils.serialization_utils import convert_json
Is it just out of pure laziness to not have to write
module_a.member_a
and instead accessmember_a
directly?
本质上是的,它允许使用 spinup
中的任何函数或 类,以及 spinup.foo
和 spinup.Bar
。大多数时候使用 spinup.foo
方式在主观上更可取,因为这样可以从定义您使用的函数的位置非常清楚。
此技术还允许使用 ExperimentGrid
,而无需在每次使用时指定 spinup.utils.run_utils.ExperimentGrid
。
当使用 type annotations:
def foo(param: ExperimentGrid) -> ExperimentGrid:
比
干净多了def foo(param: spinup.utils.run_utils.ExperimentGrid) -> spinup.utils.run_utils.ExperimentGrid: