ClassFormatError: слишком много аргументов [duplicate]

Используйте функцию встроенного getattr , чтобы получить атрибут объекта по имени. Измените имя по мере необходимости.

obj.spam = 'eggs'
name = 'spam'
getattr(obj, name)  # returns 'eggs'

5
задан Jean-François Savard 1 June 2015 в 22:19
поделиться

3 ответа

Хорошо, что вы нарушаете спецификацию VM, раздел 4.10 :

Число параметров метода ограничено 255 определением дескриптора метода (§ 4.3.3), где предел включает в себя одну единицу для этого в случае вызовов метода экземпляра или интерфейса. Обратите внимание, что дескриптор метода определяется в терминах понятия длины параметра метода, в котором параметр типа long или double вносит два блока в длину, поэтому параметры этих типов дополнительно уменьшают предел.

Я предлагаю вам преодолеть препятствия при смене сгенерированного кода ... Я очень удивлен, что он работает на Linux, если честно. Я бы не был полностью удивлен, если байт-код, который он сгенерировал, был строго недействителен, и он просто работает для вас в данный момент.

Хотя всегда есть соблазн попытаться найти способы сохранить существующий код и игнорировать ограничения, я думаю, в этом случае вы должны обратить ваше внимание на немедленное уменьшение количества параметров.

14
ответ дан Jon Skeet 21 August 2018 в 04:06
поделиться
  • 1
    @ Jean-FrançoisSavard: Нет, похоже, есть по меньшей мере 256 параметров - поэтому & quot; BLAH - это 256-й параметр & quot; и "параметр BLAH превышает предел 255 слов". Учитывая это, я все еще удивляюсь, что это работает где угодно. – Jon Skeet 2 June 2015 в 05:44
  • 2
    Ну, ты прав, тогда я тоже удивлен. – Jean-François Savard 2 June 2015 в 12:52

Есть две возможности для решения этой проблемы:

  1. Создайте свой класс без аргументов конструктора, а затем установите параметры отдыха через сеттеры.
  2. Сделайте более простые классы, каждый из которых содержит 3 или 4 переменные, и установите эти более простые объекты в 1 мастер-классе.
2
ответ дан ByteHamster 21 August 2018 в 04:06
поделиться

Ну, спецификация файла класса . говорит:

Дескриптор метода действителен только в том случае, если он представляет параметры метода с общей длиной 255 или менее, где эта длина включает в себя вклад для этого в случае вызова метода экземпляра или интерфейса. Суммарная длина рассчитывается путем суммирования вкладов отдельных параметров, где параметр типа long или double вносит два блока в длину, а параметр любого другого типа вносит один блок.

1
ответ дан Paul Bellora 21 August 2018 в 04:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: