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

2024-05-15 08:26:21 发布

您现在位置: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")

没有定义进一步的功能

谢谢:)


Tags: 函数名称参数stringobjectfoobar解决方案
3条回答

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

如果不想硬编码名称,可以使用^{}

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)

它将返回:

your_function(abc = abc, ert = 3)

相关问题 更多 >