Python函数,返回自己的带有参数的签名



标记为已解决,因为:已解决的解决方案为这个问题提供了一个足够好的解决方案,尽管它不能完全解决按需动态生成函数名的问题。

我想生成一个函数,它返回自己的签名和参数。这在Python中可能吗?因此,函数由调用本身生成,并返回代表其自身名称和参数的字符串。

这是我正在寻找的一个简单的例子:

class Object(object):
#Impl here?
pass
a = Object()
returned_string = a.foo(param1 = 1, param2 = "cheese")
print(returned_string)
#should print: a.foo(param1 = 1, param2 = "cheese")
#or     print:   foo(param1 = 1, param2 = "cheese")

重要的是,foo是一个任意名称,不应该"硬编码"。但是生成的。

代码应该允许以下操作:

print(a.doodle(param1 = 32)) #prints: doodle(param1 = 32)
print(a.bar(param42 = "pi")) #prints: bar(param42 = "pi")

而不定义进一步的函数。

谢谢:)

您应该能够使用**kwargs做您想做的事情。例如:

def my_args_are(**kwargs):
return "my_args_are({})".format(
", ".join("{0} = {1!r}".format(arg, val)
for arg, val in kwargs.items()))

工作原理:

>>> my_args_are(param1 = 1, param2 = "cheese")
"my_args_are(param1 = 1, param2 = 'cheese')"

如果您不想硬编码名称,您可以使用inspect:

import inspect
def my_args_are(**kwargs):
fname = inspect.currentframe().f_code.co_name
argstr = ", ".join("{0} = {1!r}".format(arg, val)
for arg, val in kwargs.items()))
return "{}({})".format(fname, argstr)

我假设您的意思是,一旦创建了对象,该函数就能够为该对象返回自己的输入参数。当然你也可以把它修改成字符串但是你想要返回的是输入参数也就是对象和函数的签名foo

class Object():
def foo(self, param1, param2):
self.param1 = param1
self.param2 = param2
return self.__dict__
a = Object()
returned_string = a.foo(param1 = 1, param2 = "cheese")
print(returned_string)
{'param1': 1, 'param2': 'cheese'}

返回字符串-

import inspect
class Object():
def foo(self, param1, param2):
self.param1 = param1
self.param2 = param2
d = self.__dict__
f = inspect.stack()[0][3]
return f+'('+', '.join([' = '.join([str(j) for j in i]) for i in d.items()])+')'
a = Object()
returned_string = a.foo(param1 = 1, param2 = "cheese")
print(returned_string)
foo(param1 = 1, param2 = cheese)

这就是你想要的函数:

import inspect
class Object(object):
def your_function(**options):
return f"{inspect.stack()[0][3]}({', '.join([str(key) + ' = ' + str(options[key]) for key in options.keys()])})"

如果你这样做了:

a = Object()

a.your_function(abc="abc", ert=3)

它将返回:

your_function(abc = abc, ert = 3)

最新更新