【问题标题】:Does python have something like C++'s using keyword?python 有类似 C++ 的 using 关键字吗?
【发布时间】:2010-10-07 16:49:23
【问题描述】:

在 C++ 中,您通常可以通过谨慎使用“using”关键字来大幅提高代码的可读性,例如:

void foo()
{
    std::vector< std::map <int, std::string> > crazyVector;
    std::cout << crazyVector[0].begin()->first;
}

变成

void foo()
{
    using namespace std; // limited in scope to foo
    vector< map <int, string> > crazyVector;
    cout << crazyVector[0].begin()->first;
}

python 是否存在类似的东西,还是我必须完全限定所有内容?

我将添加我知道使用有其缺陷的免责声明,并且应适当限制其范围。

【问题讨论】:

    标签: python namespaces using


    【解决方案1】:

    正如比尔所说,Python 确实有结构

    from X import *
    

    但您也可以明确指定要从模块(命名空间)导入的名称:

    from X import foo, bar, blah
    

    这往往会使代码更具可读性/更易于理解,因为在源代码中看到标识符的人不需要搜索所有导入的模块来查看它的来源。这是一个相关的问题:Namespace Specification In Absence of Ambuguity

    编辑:为了回应 Pax 的评论,我会提到你也可以写类似的东西

    import X.foo
    

    但是你需要写

    X.foo.moo()
    

    而不仅仅是

    foo.moo()
    

    当然,这不一定是坏事。我通常混合使用from X import yimport X.y 形式,无论我觉得什么都能让我的代码最清晰。在某种程度上,这当然是一件主观的事情。

    【讨论】:

    • 您可能希望将其扩展为包括“import X”,然后允许您使用该模块中的 X.y 东西。我有时更喜欢这样来减少对命名空间的污染。
    • 为什么“不像 C++”?你不能使用“使用 std::string;”吗?
    • 哦,是的,我忘了...我主要不是 C++ 程序员。 Python 的导入功能仍然稍微强大一些,因为您可以导入单个函数和变量,我认为这在 C++ 中是不可能的。
    • 大卫,在 c++ 中也是可能的。 (使用“使用声明”)。好吧。你能解释一下你是否也可以在函数中使用python的“导入”吗?
    • 一般来说是的,在 Python 中,“import”是一个可以在任何地方使用的语句,比如函数调用。不过,通配符导入只能在模块级别使用。
    【解决方案2】:

    当然,python 的活力使这变得微不足道。如果你有一个深埋在命名空间中的类:foo.bar.baz.blah,你可以这样做:

    def foo:
        f = foo.bar.baz.blah
        f1 = f()
    

    【讨论】:

    • 对我来说,这是最类似于 C++ 情况的正确答案。虽然通常人们会在 Python 中使用修改后的 import 语句,但我有时会看到需要为这样的类型设置别名,以便不必在我的代码的特定部分输入那么长、复杂的类型。
    【解决方案3】:
    import X
    

    from X import *
    

    from X import a, b, c
    

    其中 X 是您要使用的 Python 模块。

    向我们提供您认为需要清理的 Python 代码示例会对您有所帮助。

    【讨论】:

      【解决方案4】:

      除了大卫的回答:

      1. 为了PEP8,应该在from X import (foo, bar, blah) 中使用圆括号。
      2. 完整语法允许将包名称重命名(重新绑定)为当前模块范围内的新标识符,如 from foo import bar as baz

      我建议查阅import keyword、内置__import__ 的手册和sys.modules 的解释作为进一步阅读。

      【讨论】:

        【解决方案5】:

        Python 中的另一个选项是导入时的构造“as”。例如:

        from foo import bar as baz
        

        这将使foo.bar 在当前模块中以baz 的形式出现,从而允许实体在当前模块中获得不同的名称,可能是为了避免在当前模块中隐藏具有相同名称的现有实体。

        【讨论】:

          【解决方案6】:

          注意

          from foo import bar
          

          即使barfoo 包中的一个模块也可以工作。这使您可以限制命名空间污染,而不必在 foo.bar 中命名您可能希望使用的每个函数/类。它还有助于读者阅读您的代码,因为他们会看到对 bar.baz() 的调用,并且会更好地了解 baz 的来源。

          【讨论】:

            猜你喜欢
            • 2011-02-17
            • 1970-01-01
            • 2013-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-09
            • 1970-01-01
            相关资源
            最近更新 更多