python - 按照 init 中显示的顺序表示一个类,无需硬编码

标签 python python-2.7 csv

在一种方法中,我解析了一个 CSV 文件。在每次迭代中,我都会从该条目中创建一个对象。鉴于该对象代表该 CSV 文件中的一行,如果它是有序的,那么阅读起来会容易得多,而不仅仅是 return self.__dict__

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]

预期输出(包含“ pretty-print ”,与原始初始化匹配):

Student:
  name: 'Crow',
  grade: 1,
  classes: ['pecking', 'cawing', 'scavenging', 'advanced film theory']
Student:
  name: 'Odin',
  grade: 9999,
  classes: ['Norse Mythology', 'Orithonology']

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

最佳答案

您的 __init__ 方法的名称已排序;它们恰好与您的 __dict__ 键匹配,因此您可以使用它们:

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:]]))

在这里,inspect.getargspec()返回self.__init__方法的签名信息; .args 是位置参数。将其切片为 [1:] 会跳过第一个参数 self

演示:

>>> Student('Crow', 1, ['pecking', 'cawing', 'scavenging', 'advanced film theory'])
Student
  name: 'Crow'
  grade: 1
  classes: ['pecking', 'cawing', 'scavenging', 'advanced film theory']

关于python - 按照 init 中显示的顺序表示一个类,无需硬编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334838/

相关文章:

python - 我可以使用 urllib 提交 SOAP 请求吗?

python - 为什么会出现这个错误:"Sliced assignment is only supported for variables"

python - 在没有 OAuth 同意屏幕的情况下尝试授权 AWS Lambda 进行 Google Calendar API 调用

python - 为什么装饰类会破坏描述符协议(protocol),从而阻止 staticmethod 对象按预期运行?

python - 使用 Python 对 CSV 进行 MD5 哈希处理

python - Google Cloud Python灵活环境多线程数据库 worker 卡住

python-2.7 - 请求中缺少表单数据

python - 导入错误:没有名为 py31compat 的模块

php - 如何使用 PHP 对 CSV 文件进行排序而不对标题行进行排序?

python - 如何拆分 CSV 行,以便行 [0] 是名称,任何剩余的项目都是元组?