有人会知道何时将对象作为参数传递给函数

时间:2016-06-01 07:25:11

标签: python python-2.7 functional-programming

假设我有一个字符串

my_str = "Hello World"
func1 = getattr(__builtins__, 'len')
func1
<built-in function len>
func1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: len() takes exactly one argument (0 given)

func1(my_str)
11

在func1中,我必须传递 func1 中的 my_str 对象才能获得结果,但如果我做这样的事

func2 = getattr(my_str, 'replace')
func2
<built-in method replace of str object at 0x102d83cc0>

func2()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: replace() takes at least 2 arguments (0 given)

func2("Hello", "Yello")
'Yello World'

这里的func2是my_str对象的 内置方法 ,我不必传递my_str对象。

鉴于2个对象 func1 func2 我想知道是他们区分这些对象的方法运行期间有2个功能

2 个答案:

答案 0 :(得分:2)

此问题可能比您描述的要复杂得多。函数也可以使用可选参数(提供默认值),可变数量的位置参数(*args),关键字参数(**kwargs)。

要检查函数的arg-spec,可以使用inspect.getargspec

import inspect
def f(): pass
def g(x): pass
inspect.getargspec(f)
=> ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
inspect.getargspec(g)
=> ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

这清楚地显示了fg的签名之间的差异。

答案 1 :(得分:1)

如果可以回答以下问题,问题就可以解决。

函数/方法是否是对象的一部分? 在给定的例子中,func1是一个独立的函数,func2是一个&#39; str的方法。对象

&#34; __self__&#34;属性可以用来回答这个问题。

my_str = "Hello World"
func1 = getattr(__builtins__, 'len')
func1
func1.__self__ # is empty

func2 = getattr(my_str, 'replace')
func2
func2.__self__ # it is non-empty