Python 如何打印函数中变量类类型的实际名称?
我试图返回变量名,但我一直得到以下结果:Python 如何打印函数中变量类类型的实际名称?,python,python-3.x,Python,Python 3.x,我试图返回变量名,但我一直得到以下结果: 下面是我的代码: from classes.man导入man def竞争(guy1、guy2、counter1=0、counter2=0): ....................... 一些“好”的操作 ....................... 如果计数器1>计数器2: 返回guy1 鲍勃=人(172,“绿色”) 围嘴=男人(190,“棕色”) 印刷品(竞赛(鲍勃、围嘴)) 后记 如果有人想知道,请解释我可以写什么来代替下面示例中的\uuu
下面是我的代码:
from classes.man导入man
def竞争(guy1、guy2、counter1=0、counter2=0):
.......................
一些“好”的操作
.......................
如果计数器1>计数器2:
返回guy1
鲍勃=人(172,“绿色”)
围嘴=男人(190,“棕色”)
印刷品(竞赛(鲍勃、围嘴))
后记
如果有人想知道,请解释我可以写什么来代替下面示例中的\uuuu class\uuuu
,以获得变量名
def\uuu repr\uu(自):
返回self.\u类\u.\u名称__
无论如何,感谢您的支持如果类对象作为默认值传递给
print()
函数,Python将打印它们在内存中的位置。如果希望类的输出更漂亮,则需要为该类定义\uuu repr\uuuu(self)
函数,该函数应返回一个字符串,如果将对象传递到print()
,该字符串将被打印。然后,如果类对象作为默认值传递给print()
函数,则可以返回guy1Python打印类对象在内存中的位置。如果希望类的输出更漂亮,则需要为该类定义\uuu repr\uuuu(self)
函数,该函数应返回一个字符串,如果将对象传递到print()
,该字符串将被打印。然后您就可以返回guy1
\uuuu repr\uuuu
是在您的案例中定义名称的方法。
默认情况下,它为您提供对象类型信息。如果要打印更合适的名称,则应覆盖_repr__方法
例如,检查下面的代码
class class_with_overrided_repr:
def __repr__(self):
return "class_with_overrided_repr"
class class_without_overrided_repr:
pass
x = class_with_overrided_repr()
print x # class_with_overrided_repr
x = class_without_overrided_repr()
print x # <__main__.class_without_overrided_repr instance at 0x7f06002aa368>
class class\u覆盖了\u报告:
定义报告(自我):
返回“已覆盖的类\u\u repr”
未覆盖报告的类别类别报告:
通过
x=类_,其中_被覆盖_repr()
打印x#类(U覆盖)报告
x=类_,不包含覆盖的_repr()
打印x#
如果这是您想要的,请告诉我。\uuuu repr\uuuuu
是在您的案例中定义名称的方法。
默认情况下,它为您提供对象类型信息。如果要打印更合适的名称,则应覆盖_repr__方法
例如,检查下面的代码
class class_with_overrided_repr:
def __repr__(self):
return "class_with_overrided_repr"
class class_without_overrided_repr:
pass
x = class_with_overrided_repr()
print x # class_with_overrided_repr
x = class_without_overrided_repr()
print x # <__main__.class_without_overrided_repr instance at 0x7f06002aa368>
class class\u覆盖了\u报告:
定义报告(自我):
返回“已覆盖的类\u\u repr”
未覆盖报告的类别类别报告:
通过
x=类_,其中_被覆盖_repr()
打印x#类(U覆盖)报告
x=类_,不包含覆盖的_repr()
打印x#
如果这是您想要的,请告诉我。有不同的方法解决您的问题
我能理解的最简单的方法是,如果您可以更改类man
,使其在\uuuu init\uuuu
中接受可选名称,并将其存储在实例中。这应该是这样的:
class man:
def __init__(number, color, name="John Doe"):
self.name = name
# rest of your code here
这样,在您的功能中,您只需执行以下操作:
return guy1.name
此外,如果要执行额外的步骤,可以在类man
中定义\uuu str\uuu
方法,以便在将其传递给str()
或print()
时,它会显示名称:
# Inside class man
def __str__(self):
return self.name
这样,您的函数就可以:
return guy1
当您打印函数的返回值时,它实际上会打印名称
如果您无法更改classman
,下面是一个极其复杂且代价高昂的建议,它可能会根据上下文而中断:
import inspect
def competition(guy1, guy2, counter1=0, counter2=0):
guy1_name = ""
guy2_name = ""
for name, value in inspect.stack()[-1].frame.f_locals.items():
if value is guy1:
guy1_name = name
elif value is guy2:
guy2_name = name
if counter1 > counter2:
return guy1_name
elif counter2 > counter2:
return guy1_name
else:
return "Noone"
有不同的方法来解决你的问题
我能理解的最简单的方法是,如果您可以更改类man
,使其在\uuuu init\uuuu
中接受可选名称,并将其存储在实例中。这应该是这样的:
class man:
def __init__(number, color, name="John Doe"):
self.name = name
# rest of your code here
这样,在您的功能中,您只需执行以下操作:
return guy1.name
此外,如果要执行额外的步骤,可以在类man
中定义\uuu str\uuu
方法,以便在将其传递给str()
或print()
时,它会显示名称:
# Inside class man
def __str__(self):
return self.name
这样,您的函数就可以:
return guy1
当您打印函数的返回值时,它实际上会打印名称
如果您无法更改classman
,下面是一个极其复杂且代价高昂的建议,它可能会根据上下文而中断:
import inspect
def competition(guy1, guy2, counter1=0, counter2=0):
guy1_name = ""
guy2_name = ""
for name, value in inspect.stack()[-1].frame.f_locals.items():
if value is guy1:
guy1_name = name
elif value is guy2:
guy2_name = name
if counter1 > counter2:
return guy1_name
elif counter2 > counter2:
return guy1_name
else:
return "Noone"
瓦伦丁的答案——至少是答案的第一部分(在man
中添加name
属性)——当然是正确的、显而易见的解决方案
现在请注意/第二部分(inspect.stack
hack),它充其量是脆弱的-我们感兴趣的“变量名”可能不一定是在第一个父帧中定义的,FWIW它们也可能只是来自dict等
另外,competition()
函数没有责任关心这一点(谢谢,不要将域层和表示层混为一谈),而且它完全没有用,因为调用方代码可以自己轻松解决这一部分:
def competition(guy1, guy2, counter1=0, counter2=0):
.......................
some *ok* manipulations
.......................
if counter1>counter2:
return guy1
def main():
bob = man(172, 'green')
bib = man(190, 'brown')
winner = competition(bob, bib)
if winner is bob:
print("bob wins")
elif winner is bib:
print("bib wins")
else:
print("tie!")
瓦伦丁的答案——至少是答案的第一部分(在
man
中添加name
属性)——当然是正确的、显而易见的解决方案
现在请注意/第二部分(inspect.stackhack),它充其量是脆弱的-我们感兴趣的“变量名”可能不一定是在第一个父帧中定义的,FWIW它们也可能只是来自dict等
另外,competition()
函数没有责任关心这一点(谢谢,不要将域层和表示层混为一谈),而且它完全没有用,因为调用方代码可以自己轻松解决这一部分:
def competition(guy1, guy2, counter1=0, counter2=0):
.......................
some *ok* manipulations
.......................
if counter1>counter2:
return guy1
def main():
bob = man(172, 'green')
bib = man(190, 'brown')
winner = competition(bob, bib)
if winner is bob:
print("bob wins")
elif winner is bib:
print("bib wins")
else:
print("tie!")
本例中变量的名称为
guy1
。我不认为这是你真正想要的。你应该解释你真正想要的输出。你一定要读这篇文章,然后接受瓦伦丁B。回答。@DanielRoseman he