2010-10-15 56 views
7

是否有可能在python中聲明函數並稍後或在單獨的文件中定義它們?python函數聲明有一個可讀和乾淨的代碼?

我有一些這樣的代碼:

class tata: 
    def method1(self): 
     def func1(): 
     # This local function will be only used in method1, so there is no use to 
     # define it outside. 
     # Some code for func1. 
     # Some code for method1. 

的問題是,代碼變得混亂和難以閱讀。所以我想知道是否有可能在method1內聲明func1並在以後定義它?

+0

如果func1()實際上只與method1()相關,並且內部方法對您而言成爲問題,則表明它確實應該是單獨的類。 – 2010-10-15 22:54:56

回答

6

當然,沒問題:

foo.py:

def func1(): 
    pass 

script.py:

import foo 
class tata: 
    def method1(self): 
     func1=foo.func1 
+0

好想法!然而,本地函數的思想是使這個函數只能在內部範圍內使用。那麼,在'method1'裏面定義新的'func1'有什麼意義呢?做起來並不容易:從foo導入func1並使用它。 – banx 2010-10-15 22:47:26

+0

@banx:Alex Martelli的答案在這裏(http:// stackoverflow。com-questions/1744258/is-import-module-better-coding-style-than-from-module-import-function)說服我避免'完全從foo導入func1'。 – unutbu 2010-10-15 22:57:43

+0

@banx:是的,把'func1'的定義放在'method1'裏面,至少是半私人的,儘管我不會把它放在進取的字節碼黑客中(http://stackoverflow.com/questions/3908335/python功能本地名稱綁定從一個外部範圍/ 3913185#3913185)找到一種方法,使您認爲是私人不太私人。 – unutbu 2010-10-15 23:00:42

2

內部定義在內部範圍內創建一個單獨的名稱。它會影響你後來用相同名稱定義的任何東西。如果你想稍後定義該功能,那麼就這樣做。該名稱僅在實際使用時才被檢查。

def foo(): 
    print 'foo' 
    bar() 

def bar(): 
    print 'bar' 

foo() 
3

我想你想要的是內method1導入功能,例如

def method1(...): 
    from module_where_func1_is_defined import func1 
    # do stuff 
    something = func1(stuff, more_stuff) 
    # do more stuff 

Python模塊基本上只是文件;只要文件module_where_func1_is_defined.py與您的腳本位於相同的目錄中,method1就可以導入它。

如果您希望能夠以定製的方式method1作品,也讓它顯得更加清晰,它採用func1,你可以通過func1method1作爲默認參數:

import other_module 

# various codes 

def method1(other_args, func=other_module.func1) 
    # do stuff 
    something = func(stuff, more_stuff) 
    # do more stuff 
2

如果FUNC1( )需要處理method1()的範圍中包含的任何東西,所以最好在func1()的定義處留下。你必須有FUNC1()收到如果它不是方法1的()

+0

+1因爲嵌套函數直接從它們包含的範圍中訪問名字,這在Python中是一個重要的習慣用法。目前的範圍規則非常強大,並且經過深思熟慮 - 請參閱Python 2.1中引入的[PEP 227 - 靜態嵌套範圍(tpp://www.python.org/dev/peps/pep-0227/)。把定義放在一個單獨的文件當前會阻止這個,除非以某種方式工作。 – martineau 2010-10-17 20:43:13

0

然後才能創建方法

 

class Something(object): 
    def test1(self): 
    pass 

def dummy(self): 
    print "ok", self 

Something.test1 = dummy 

然而這是不可能有一個匿名的範圍內定義的任何相關數據作爲參數功能(當然,也有lambda表達式,但你不能有陳述有),所以你必須提供一個臨時名稱

你可能想使用的裝飾,以使其更易於閱讀:

 
def define(cls, name): 
    def decor(f): 
    setattr(cls, name, f) 
    return decor 


class Something(object): 
    def test1(self): 
    pass 

@define(Something, "test1") 
def dummy(self): 
    print "ok", self 

此代碼應該更具可讀性。它仍然會污染虛設,但用null初始化它。