0

如何使用文件中的文本作为变量名?我正在从 excel 文件中提取值。我在 python 3 中使用 xlrd 和 xlutils。

class employee(object):
def __init__(self, name):
    self.name = name
    emp_list.append(name)
def bulk_hours(self,sunday=0,monday=0,tuesday=0,wednesday=0,thursday=0,friday=0,saturday=0):
    self.sunday = sunday
    self.monday = monday
    self.tuesday = tuesday
    self.wednesday = wednesday
    self.thursday = thursday
    self.friday = friday
    self.saturday = saturday

我正在将员工从电子表格中提取出来。我正在尝试使用他们的真实姓名。我很想知道任何可行的解决方案。谢谢!

编辑:请原谅我对编程的无知和我可怕的帖子。我正在尝试制作一个简单的程序,允许我从 Excel 加载员工姓名和工作时间表。我还将确保将任何编辑保存回电子表格中。员工被贴上他们的名字。我正在尝试将他们的名称加载为变量,以便我可以这样做:

John = employee('John')
John.bulk_hours(0,8,8,8,8,8,0)
Stacy = employee('Stacy')
print(John.monday)

我的目标是使用他们的名字作为我可以使用点符号的变量。这可行吗?他们是我应该用其他方式解决这个问题吗?

def load(row):
employee2 = employee(s.cell(row, 0).value)
employee2.bulk_hours(s.cell(row, 1).value, s.cell(row, 2).value, s.cell(row, 3).value, s.cell(row, 4).value,
                     s.cell(row, 5).value, s.cell(row, 6).value, s.cell(row, 7).value)
print(employee2.saturday)

我正在尝试使用这样的功能来加载多个员工及其工作时间。

我可以以某种方式使用这样的列表吗?

worker = ['Joe']
worker[0] = employee('Joe')
worker[0].bulk_hours(0,8,8,8,8,8,0)
print(worker[0].monday)

感谢您的宝贵时间。

4

2 回答 2

1

覆盖__getattr__以透明地访问内部字典。

class employee(object):
    def __init__(self, ...):
        self._internal_d = extract_data()  # replace extract_data with however you extract CSV values to a dictionary
        ...  # perform other initialization

    def __getattr__(self, name):
        try:
            return self._internal_d[name]
        except KeyError:
            raise AttributeError()

或者,您可以实现__setattr__以允许写入属性。

    def __setattr__(self, name, value):
        return self._internal_d[name] = value

说明:当 python 进行变量赋值并且“正常”找不到变量名时,它会检查对象是否具有__getattr__. 如果是,它会调用__getattr__以获取具有指定名称的值。因此,您可以拥有动态变量名称。同样对于__setattr__.

于 2017-02-21T02:40:53.527 回答
0

您不想使用来自电子表格的变量名称。或一:变量名是正在运行的程序的内部变量,并不意味着要再次导出到输出文件。

John当程序运行时,变量被用来代表约翰的数据是没有意义的。例如,假设可以创建一个特殊的标记来使用变量名称——比如说一个?前缀来从另一个变量中获取名称。你的例子是这样的:

def row_data(emp_name, *args):
    ?emp_name = employee(emp_name)
    ?emp_name.bulk_hours(*args)
    print(?emp_name.monday)

因此,即使在运行时?emp_name会通过变量的内容进行交换,您的name程序对于阅读代码的人来说仍然看起来是一样的。因此,简单地让变量命名为personoremployee 或任何东西更有意义,因为它可以代表任何员工(事实上,当您遍历电子表格内容时,通常该变量将携带关于一个人的数据) .

也就是说,有时我们确实希望程序中的数据确实具有程序化标签。但仍然在那些情况下 - 这就是字典的用途 - 创建一个employees字典并填充它 - 然后你可以将名称作为键:

employees = dict()
def row_data(emp_name, name):
    person = employee(emp_name)
    person.bulk_hours(*args)
    employes[emp_name] = person

def print_employeers():
    for person_name, person_data in employees.items():
         print(person_name, person_data)

如您所见,可以打印所有员工数据而无需输入他们的姓名。此外,如果它是一个交互式程序,则可以找到与用户输入的名称相关的数据,将其用作字典键。

但是,如果您打算让程序自己生成其他 Python 源文件,并最终.py为每个员工生成一个文件。在这种情况下,只需使用模板引擎,如 Jinja2,或简单地使用 str 的format方法。(仍然很难想象你为什么需要这样的东西)。

而且,为了得到一个完整的答案,可以在 Python 中创建动态变量名。但是,您将处于与我在此处的第一个示例中描述的完全相同的情况。

任何正在运行的代码的全局变量都保存在一个常规的 Python 字典中,该字典由函数调用返回globals()。同样,局部变量的值保存在通过调用返回的字典中locals() - 尽管这些对于在编译时已知的变量表现不佳(在这种情况下,局部变量被缓存在框架对象中,而 locals 字典仅在读取时与它们同步,但不能通过本地写入)

所以:

def row_data(emp_name, *args):
    globals()[emp_name] = employee(emp_name)
    globals()[emp_name].bulk_hours(*args)
    print(globals()[emp_name].monday)

将按照您的要求工作-但很容易看出它是无用的。

于 2017-02-21T03:17:25.850 回答