我正在使用NamedTuple定义要使用telnetlib连接到的服务器。 然后,我创建了一个类,该类定义了到服务器的连接,并在类中包含了服务器详细信息和连接方法。 然后,在类之外,我想使用连接方法以及服务器的NamedTuple作为连接凭据。但是,我不断收到错误消息,即连接方法缺少NamedTuple参数。
我尝试将NamedTuple拉到类的外面,试图将Namedtuple放在类的init方法内。似乎没有任何作用。
这是我的代码:
import telnetlib
from typing import NamedTuple
class Unit(NamedTuple):
name: str
ip: str
port: str
def printunit(self, unit):
print(unit.name)
print(unit.ip)
print(unit.port)
class TnCnct:
Server1 = Unit("Server1", "1.1.1.1", "23")
Server2 = Unit("Server2", "2.2.2.2", "23")
Server3 = Unit("Server3", "3.3.3.3", "23")
def __init__(self):
pass
def cnct(self, u):
try:
tn = telnetlib.Telnet(u.ip, u.port, 10)
tn.open(u.ip, u.port)
tn.close()
response = u.name + " " + "Success!"
except Exception as e:
response = u.name + " " + "Failed!"
print(e)
finally:
print(response)
TnCnct.cnct(TnCnct.Server1)
我得到的确切错误:
TypeError: cnct() missing 1 required positional argument: 'u'
答案 0 :(得分:3)
1。您可能要使用namedtuples from collections-而不是typing:
namedtuples
:
返回一个名为typename的新元组子类。新的子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段以及可索引和可迭代的字段。子类的实例还具有有用的文档字符串(带有typename和field_names)和有用的 repr ()方法,该方法以name = value格式列出元组的内容。
vs typing
:
此模块支持PEP 484和PEP 526指定的类型提示。最基本的支持包括类型Any,Union,Tuple,Callable,TypeVar和Generic。有关完整规范,请参见PEP484。有关类型提示的简化介绍,请参见PEP 483。
键入的NamedTuples只是原始命名元组的包装。
2。您需要实例才能使用实例方法:
修复两个问题:
import telnetlib
from collections import namedtuple
def printunit(self, unit):
print(unit.name)
print(unit.ip)
print(unit.port)
Unit = namedtuple("Unit","name ip port")
Unit.printunit = printunit
class TnCnct:
Server1 = Unit("Server1", "1.1.1.1", "23")
Server2 = Unit("Server2", "2.2.2.2", "23")
Server3 = Unit("Server3", "3.3.3.3", "23")
def __init__(self):
pass
def cnct(self, u):
try:
tn = telnetlib.Telnet(u.ip, u.port, 10)
tn.open(u.ip, u.port)
tn.close()
response = u.name + " " + "Success!"
except Exception as e:
response = u.name + " " + "Failed!"
print(e)
finally:
print(response)
# create a class instance and use the cnct method of it
connector = TnCnct()
connector.cnct(TnCnct.Server1)
实例和类(方法/变量)之间的区别详细说明。此处:
答案 1 :(得分:2)
cnct
是需要对象实例的方法。在这里,您尝试将其称为类方法。
如果这是您想要的,则应使用装饰器:
@classmethod
def cnct(cls, u):
...