Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何打印函数中变量类类型的实际名称?_Python_Python 3.x - Fatal编程技术网

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()
函数,则可以
返回guy1

Python打印类对象在内存中的位置。如果希望类的输出更漂亮,则需要为该类定义
\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
当您打印函数的返回值时,它实际上会打印名称


如果您无法更改class
man
,下面是一个极其复杂且代价高昂的建议,它可能会根据上下文而中断:

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
当您打印函数的返回值时,它实际上会打印名称


如果您无法更改class
man
,下面是一个极其复杂且代价高昂的建议,它可能会根据上下文而中断:

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