2016-12-15 29 views
0
def func(raw_input()): 
    #stuff goes here.. 

爲什麼不能使用raw_input()作爲參數?使用raw_input()作爲參數

+0

你想要完成什麼?您發佈的代碼在語義上不一致。 – Prune

+0

我不想完成任何事情。我正要去看Zed的「以艱難的方式學習Python」,在閱讀函數和參數時我想到了這一點。 –

+1

如果代碼有效,您會期望代碼如何執行?如果這意味着「在調用此函數時獲取原始輸入作爲參數」,那麼**如何引用輸入的字符串?** –

回答

3

因爲函數調用的返回值在語義上與參數不同。 raw_input()返回一個字符串;一個參數必須是傳入的值的標識符。

2

您不能。

順便說一句,你可能誤認爲使用命名參數可以工作:

def func(s=raw_input()): 
    print(s) 

func() 
func() 

那麼唯一的問題是,它只是似乎工作。第一次調用func()時,s通過提示您輸入字符串進行評估。

第二次,s的默認值是已知的,並且不會提示您。

+0

'def func(s = raw_input):return s()'? –

+1

這將工作!但你也可以'返回raw_input()'。我只是指出,你不應該強制python做這樣的東西:) –

+1

哦,我同意這樣做是愚蠢的做任何一種方式:)並且最好將'raw_input()'綁定到函數內的名字。 –

0

試試這個奇怪的OOP解決方案。

class Runnable: 
    def __init__(self,function, *args, **kwargs): 
     self.function = function 
     self.args = args 
     self.kwargs = kwargs 
    def run(self): 
     return self.function(*self.args, **self.kwargs) 

Runnable加載了一個功能和參數的對象。 .run()在您準備就緒時執行。

下面是它的用法:

def func(runnable_thing): 
    print(runnable_thing.run()) 

super_raw = Runnable(raw_input, "Please Type your Input: ") 

func(super_raw) # prints input from raw 

很酷的事情是,運行的類我做了其他功能的作品具有較大PARAMS爲好。

import datetime 
foo = Runnable(datetime.datetime, 2016, 12, 15) ## foo is not yet a datetime object 
bar = foo.run() ## bar is a datetime object 

如果你不是在它結束的.run()的粉絲,那麼我們可以按照Deloith's建議使用__call__()使Runnable的感覺像一個功能。

class Runnable: 
    def __init__(self,function, *args, **kwargs): 
     self.function = function 
     self.args = args 
     self.kwargs = kwargs 
    def __call__(self): 
     return self.function(*self.args, **self.kwargs) 

從這一刻起,它確實感覺就像我們已經創建了一個新功能。

def func(runnable_thing): 
     print(runnable_thing()) 

    super_raw = Runnable(raw_input, "Please Type your Input: ") 

    func(super_raw) # prints input from raw  

試試這個尺寸,讓我知道你喜歡它。

+0

我個人補充說,你不一定希望它是一個'run()'函數,它必須被命名才能使用,但實現魔術鉤'__call __()',它可以讓一個對象假裝它是一個函數,所以你可以調用'foo = Runnable(...); foo()' – Delioth

+0

好的建議讓我編輯這個。 – Conic