簡體   English   中英

python是否有類似C ++的using關鍵字的東西?

[英]Does python have something like C++'s using keyword?

在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是否存在類似的東西,還是我必須完全限定所有內容?

我將添加一個免責聲明,即我知道使用存在缺陷,應該在范圍上進行適當限制。

正如Bill所說,Python確實具有

from X import *

但您也可以明確指定要從模塊(名稱空間)導入的名稱:

from X import foo, bar, blah

這往往會使代碼更加可讀/容易理解,因為在源中看到標識符的人不需要遍歷所有導入的模塊來查看其來源。 這是一個相關的問題: 缺少歧義的命名空間規范

編輯 :針對Pax的評論,我會提到您還可以編寫類似

import X.foo

但是那你需要寫

X.foo.moo()

而不只是

foo.moo()

當然,這不一定是一件壞事。 我通常將from X import yimport Xy兩種形式混合使用,無論我覺得使我的代碼最清晰。 在某種程度上,這當然是主觀的事情。

import X

要么

from X import *

要么

from X import a, b, c

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

為您提供一個您認為需要清理的Python代碼示例會對您有所幫助。

當然,python的動態性使它變得微不足道。 如果您將一個類埋在名稱空間foo.bar.baz.blah中,則可以執行以下操作:

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

Python中的另一個選項是導入時的結構“ as”。 例如:

from foo import bar as baz

這會將foo.bar作為baz引入當前模塊中,這允許該實體在當前模塊中獲得不同的名稱,這可能是為了避免在當前模塊中隱藏具有相同名稱的現有實體。

除了大衛的答案:

  1. 出於PEP8的考慮 from X import (foo, bar, blah)應該在from X import (foo, bar, blah)使用圓括號from X import (foo, bar, blah)
  2. 完整的語法允許將軟件包名稱重命名(重新綁定)為當前模塊范圍內的新標識符,如from foo import bar as baz

我建議您查閱手冊以獲取import關鍵字 ,內置的__import__sys.modules的說明,以進一步閱讀。

注意

from foo import bar

即使barfoo包中的模塊,它也可以工作。 這使您可以限制名稱空間污染,而不必在foo.barfoo.bar您可能會想使用的每個函數/類。 它還可以幫助您的代碼讀者,因為他們會看到對bar.baz()的調用,並且可以更好地了解baz來源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM