Python方法参数默认值引用外部类实例报NameError问题
报错根因
Python函数(包括类方法)的默认参数是在函数定义阶段完成求值的,不是在函数被调用的时候才计算。
你定义Table类、写入print_table方法的阶段,Python就会立刻尝试解析f-string里的human变量,这时候类定义流程还没走完,就算你后续会在全局作用域定义human实例,这个阶段该变量也还没被创建,自然抛出NameError。
你在类的其他方法里直接用human.bet不报错,是因为方法内部的代码是方法被实际调用时才执行,这时候你已经完成了human实例的定义,名字查找能命中,所以不会出问题。
可行实现方案
用None作为默认参数的哨兵值,把默认消息的拼接逻辑移到方法内部,这样字符串的计算时机就推迟到方法调用阶段,就能正常访问到已经定义好的human实例了。
修正后的代码如下:
class Table(): # __init__和其他原有方法保持不变 def print_table(self, message=None): # 未传入message时,调用阶段才计算默认值 if message is None: message = f'Current bet: {human.bet}' self.human_cards(human.hold_cards) self.info_lines(human, cpu, message) self.cpu_cards(cpu.hold_cards) for item in self.hum_print: print(item) for item in self.info_print: print(item) for item in self.cpu_print: print(item)
补充说明:这个逻辑和Python经典的"不要用可变对象做默认参数"的坑是同一个原理,本质都是默认参数定义时求值的特性导致的。
内容的提问来源于stack exchange,提问作者MWallace
相关产品推荐
相关产品推荐

