在函数的类外使用静态NamedTuples变量

时间:2019-08-04 08:48:04

标签: python python-3.x namedtuple telnetlib

我正在使用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'

2 个答案:

答案 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):
        ...