Python 按照init中显示的顺序表示一个类,不使用硬编码

Python 按照init中显示的顺序表示一个类,不使用硬编码,python,python-2.7,csv,Python,Python 2.7,Csv,在一种方法中,我解析CSV文件。在每次迭代中,我从该条目中生成一个对象。考虑到该对象表示该CSV文件中的一行,如果它是有序的,那么读取起来就容易多了,而不仅仅是返回self class Student: def __init__(self, name, grade, classes): self.name = name self.grade = grade self.classes = classes def __repr__(self): return

在一种方法中,我解析CSV文件。在每次迭代中,我从该条目中生成一个对象。考虑到该对象表示该CSV文件中的一行,如果它是有序的,那么读取起来就容易多了,而不仅仅是
返回self

class Student:
  def __init__(self, name, grade, classes):
    self.name = name
    self.grade = grade
    self.classes = classes
  def __repr__(self):
    return #ordered version of self
CSV功能:

with open(arguments.csv, 'rb') as csv_file:
  csv_data = csv.reader(csv_file)
  data = [Student(*row) for row in csv_data]
预期输出(包括“漂亮打印”,与原始初始匹配):


如何在不硬编码的情况下以有序的方式表示它?

您的
\uuu init\uuu
方法的名称是有序的;它们恰好与您的
\uuuu dict\uuuu
键匹配,因此您可以使用这些键:

import inspect

class Student(object):
    def __init__(self, name, grade, classes):
        self.name = name
        self.grade = grade
        self.classes = classes
    def __repr__(self):
        return '{}\n{}'.format(type(self).__name__,
            '\n'.join(['  {}: {!r}'.format(name, getattr(self, name))
                       for name in inspect.getargspec(self.__init__).args[1:]]))
这里,返回
self.\uuu init\uu
方法的签名信息
.args
是位置参数。将其切片到
[1:][/code>将跳过第一个参数
self

演示:


您的
\uuuu init\uuuu
方法的名称已排序;它们恰好与您的
\uuuu dict\uuuu
键匹配,因此您可以使用这些键:

import inspect

class Student(object):
    def __init__(self, name, grade, classes):
        self.name = name
        self.grade = grade
        self.classes = classes
    def __repr__(self):
        return '{}\n{}'.format(type(self).__name__,
            '\n'.join(['  {}: {!r}'.format(name, getattr(self, name))
                       for name in inspect.getargspec(self.__init__).args[1:]]))
这里,返回
self.\uuu init\uu
方法的签名信息
.args
是位置参数。将其切片到
[1:][/code>将跳过第一个参数
self

演示:


我通常更喜欢声明而不是内省:

import itertools
class Student(object):

    columns = ('name', 'grade', 'classes')

    def __init__(self, *row):
        self.row = _,_,_ = row # Aaaaah, dragons !

    def __getattr__(self, key):
        if key in self.columns:
            return self.row[self.columns.index(key)]

    def __repr__(self):
        return '{}\n{}'.format(
                type(self).__name__,
                '\n'.join(('  {}: {!r}'.format(*item)
                    for item in itertools.izip(self.columns, self.row) ))
                )
您甚至可以添加通用触摸:

import itertools
class Row(object):
    columns = ()
    def __init__(self, *row):
        if len(row) != len(self.columns):
            raise TypeError('{}() takes {} argument'.format(
                    type(self).__name__, len(self.columns)))
        self.row = row
    def __getattr__(self, key):
        if key in self.columns:
            return self.row[self.columns.index(key)]
    def __repr__(self):
        return '{}\n{}'.format(
                type(self).__name__,
                '\n'.join(('  {}: {!r}'.format(*item)
                    for item in itertools.izip(self.columns, self.row) ))
                )
class Student(Row):
    columns = ('name','grade','classes')

我通常更喜欢声明而不是内省:

import itertools
class Student(object):

    columns = ('name', 'grade', 'classes')

    def __init__(self, *row):
        self.row = _,_,_ = row # Aaaaah, dragons !

    def __getattr__(self, key):
        if key in self.columns:
            return self.row[self.columns.index(key)]

    def __repr__(self):
        return '{}\n{}'.format(
                type(self).__name__,
                '\n'.join(('  {}: {!r}'.format(*item)
                    for item in itertools.izip(self.columns, self.row) ))
                )
您甚至可以添加通用触摸:

import itertools
class Row(object):
    columns = ()
    def __init__(self, *row):
        if len(row) != len(self.columns):
            raise TypeError('{}() takes {} argument'.format(
                    type(self).__name__, len(self.columns)))
        self.row = row
    def __getattr__(self, key):
        if key in self.columns:
            return self.row[self.columns.index(key)]
    def __repr__(self):
        return '{}\n{}'.format(
                type(self).__name__,
                '\n'.join(('  {}: {!r}'.format(*item)
                    for item in itertools.izip(self.columns, self.row) ))
                )
class Student(Row):
    columns = ('name','grade','classes')

啊,玛蒂金,你真是一个genius@crow没有人会怀疑,但请少用助长自豪感的字眼啊,玛蒂金,你真是一个genius@crow没有人怀疑这一点,但要谨慎使用助长自豪感的词语