Python 函数 returns 自己的签名带参数

Python function which returns its own signature with parameters

标记为已解决,因为: 已解决的解决方案为问题提供了一个足够好的解决方案,即使它没有完全解决按需动态生成函数名称的问题。

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

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

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")

没有定义更多函数。

谢谢:)

我假设你的意思是,一旦你创建了一个对象,该函数就能够 return 它自己的输入参数。您当然可以将其修改为看起来像一个字符串,但您想要 return 的是作为该对象和函数签名的输入参数 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)

您应该可以使用 **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)

所以这是你想要的功能:

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)

它将 return:

your_function(abc = abc, ert = 3)