2017-02-21 3 views
0

Как использовать текст из файла в качестве имени переменной? Я извлекаю значения из файла excel. Я использую xlrd и xlutils с питоном 3.Как использовать текст из файла в качестве имени переменной?

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) 

Благодарим вас за ценное время.

+1

Вы можете показать образец текстового файла и каков ваш желаемый результат или что вы пытаетесь сделать? – NinjaGaiden

+3

У вас нет; вы задаете неправильный вопрос. Расскажите, пожалуйста, что вы пытаетесь сделать; правильное решение, скорее всего, связано с именем словаря, а не с динамическими именами переменных. –

+0

@NinjaGaiden Я хотел бы иметь возможность вытащить имя сотрудника как «Джон», а затем сделать John = employee ('John') –

ответ

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 

Объяснение: когда питон делает назначение переменной и не может найти имя переменной «обычно», он проверяет, является ли объект имеет __getattr__. Если это так, он вызывает __getattr__, чтобы получить значение с указанным именем. Таким образом, вы можете иметь имена динамических переменных. Аналогично для __setattr__.

+0

Я пытаюсь получить репутацию своего чатбота, чтобы он мог общаться, поэтому вот ответ под его учетной записью. –

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, Юр программа будет по-прежнему выглядеть так же, чтобы кто-то читает код.Таким образом, имеет смысл просто позволить переменной быть названной person или employee или что угодно, так как она может представлять любого сотрудника (и на самом деле будет, когда вы будете контактировать содержимое электронной таблицы, обычно переменная будет нести данные об одном человеке время).

Тем не менее, бывают случаи, когда мы хотим иметь данные в программе, которые имеют программную маркировку. но до сих пор в тех случаях, - это то, что словари для - создать employees Dict, и заполнить его - и тогда вы можете иметь имена в качестве ключей:

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. (По-прежнему сложно представить, почему вам понадобится такая вещь).

И, чтобы получить полный ответ, : можно создавать имена динамических переменных в Python. Тем не менее, вы будете в той же ситуации, которую я описал в первом примере здесь.

Глобальные переменные для любого работающего кода хранятся в обычном словаре Python, который возвращается вызовом функции globals(). Точно так же значения для локальных переменных хранятся в словаре, возвращаемом вызовом locals(), хотя они не очень хорошо ведут себя для переменных, известных во время компиляции (в этом случае локальные переменные кэшируются в объекте фрейма, а местные ДИКТ только synchornized с ними, когда он читается, но они не могут быть написаны с помощью местных жителей)

Итак:

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

будет работать так же, как вы просили, - но легко видеть, что это бесполезно ,

Смежные вопросы