2013-02-06 78 views
3

我有一個模塊,我想參數化,或者說我想從一個對象導入函數。python中的參數模塊?從對象導入函數

這就是我希望能夠給它的參數,將改變它的行爲之前,我從它進口的東西。

一種方法是將我的模塊作爲對象並使用這些函數。目前我這樣做:

class MyModule(object): 
    def __init__(self, previous_sayings): 
     self.sayings = previous_sayings 
    __all__ = ['sayhi'] 
    def sayhi(self): 
     self.sayings.append("hi!") 

mod = MyModule(["oh no!"]) 
sayhi = mod.sayhi 
sayhi() 
sayhi() 
print mod.sayings 

這應該打印出["oh no!", "hi!", "hi!"]

但是,這會更好地工作,你有更多的功能。

我希望能夠做這樣的事情:

mod = MyModule(["oh no!"]) 
from mod import * 
sayhi() 
sayhi() 

print mod.sayings 

是這樣可能什麼?我可以繼承基礎模塊嗎?如果我添加約束條件,它應該看起來對用戶來說顯而易見是怎麼回事?

+1

爲什麼使用一個模塊會比使用一個類越好,其實並不清晰。難道你只是希望能夠在你自己的命名空間中擁有實例方法嗎? –

+0

我不在乎對象是否實際上是一個模塊或類。我只是想能夠很容易地將適當的函數和值導入到本地名稱空間,並讓它們仍然可以訪問我傳遞的參數。那有意義嗎? –

+0

@JohnSalvatier:'sayhi = mod.sayhi()'究竟有什麼問題?這是一種非常常見的Python習慣用法(尤其是如果包含等效代碼,比如傳遞's.find'而不是'lambda x:s.find(x)'或'functools.partial(str.find,s)'),使得一個像類實例一樣的模塊是絕對不行的。 – abarnert

回答

2

有實現有關模塊的幾件事情:

  • 他們是單身,這意味着你將永遠只能有其中的一個,不管你有多少地方導入

  • 你不能傳遞參數

  • from <module> import *是危險的,不是一個好習慣,應該只與已經這樣設計的

  • 模塊一起使用
  • 在模塊中定義的所有函數,類等始終將該模塊視爲其全局名稱空間。

你可以得到類似的東西你想要什麼:

8<--mod.py------------------------------------------------------ 
sayings = [] 
def sayhi(): 
    sayings.append("Hi!") 
8<-------------------------------------------------------------- 

import mod 
mod.sayings = ['oh no!'] # or mod.sayings.append('oh no') 
from mod import sayhi 
sayhi() 
sayhi() 
print mod.sayings 
+1

+1。但是,如果(在讀完所有這些注意事項之後)你要從'mod import *'執行'',你真的想在'mod.py'中使用'__all__'來限制被導入的內容。 (在這種情況下,它會是'__all__ = ['sayhi']'。) – abarnert

0

如果唯一的問題是:

sayhi=mod.sayhi() 
saybye=mod.saybye() 
# … 40 more functions 

是更詳細的比:

from mod import sayhi, saybye, # … 40 more functions 

更好的解決方案可能只是執行導入p rogrammatically:

for name in mod.__all__: 
    locals[name] = getattr(mod, name) 

或者:

locals.update({name: getattr(mod, name) for name in mod.__all__}) 
+0

然後有人會問:「你爲什麼不從'mod import *'? ;) –

+0

@EthanFurman:如果'mod'是一個類,沒有人知道Python會問這個問題。如果他們這樣做,就說:「因爲mod不是一個模塊,它是一個對象,可能是許多Foo類的實例之一,你不能從對象導入,這裏有一個指向手冊的鏈接。」 (命名對象'mod'的確使它更加混亂,但這在原始文章中。)如果'mod'確實不適合作爲一個對象並且應該是一個模塊,那麼是的,這個解決方案很愚蠢。但顯然,OP不想要一個對象的唯一原因是「這會使你擁有的功能越來越少」。 – abarnert

相關問題