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)
标记为已解决,因为: 已解决的解决方案为问题提供了一个足够好的解决方案,即使它没有完全解决按需动态生成函数名称的问题。
我想生成一个函数,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)