2016-12-15 31 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