LINUX.ORG.RU

Как этот код исполняется?

 ,


0

1

https://github.com/pytorch/text/blob/master/torchtext/datasets/text_classific...

Выполняется кодом:

    train_dataset, test_dataset = text_classification.DATASETS['AG_NEWS'](
        root='./.data', ngrams=NGRAMS, vocab=None)

Как DATASETS[]() вызывается?

★★★★★

Последнее исправление: steemandlinux (всего исправлений: 2)

Ааа, доперло DATASETS[‘AG_NEWS’] == def AG_NEWS(*args, **kwargs):

Я же уже ковырял это.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от zudwa

Я всё время забываю что в словаре что угодно можно хранить.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вроде больше ни в одном языке такой наркомании нет

Че, ни в одном ЯП нет ф-ций первого порядка? А чего еще нет ни в одном языке?

Dred ★★★★★
()
Ответ на: комментарий от Sahas

Ага и меня всё время клинит когда их вижу. В numpy есть ещё глум с объектными векторами.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Dred

Причём здесь функции первого порядка, поехавший?

anonymous
()
Ответ на: комментарий от anonymous

Слава петону тогда уж. Вроде больше ни в одном языке такой наркомании нет

Гвидо грит «езык нужен для реализации DSL, как лисп и круче лиспа, он не нужен для того, чтобы его писать, не нужен для того, чтобы его исполнять — на него нужно смотреть и восхищаться». В итоге фичи, которые по хорошему кроме отладчика не должны быть нигде, протекают в язык повсеместно.

Что хотели сделать разрабы записью «DATASETS['AG_NEWS'](root='./.data', ngrams=NGRAMS, vocab=None)»? Ну типа нужно сделать запрос из набора данных по определенным параметрам. В языке для белых людей это делается ЯВНО: «DATASETS['AG_NEWS'].request(root='./.data', ngrams=NGRAMS, vocab=None)». Это сложно? Это нечитаемо? Неа, нужно перехватывать фундаментальные конструкции языка. Я очень сильно сомневаюсь, что «DATASETS['AG_NEWS']» — это именно функция, а не объект с переписанным __call__. То есть, у вас как бы объект-класс, но как бы и функция. А завтра в результате какого-то бага «DATASETS['AG_NEWS']» внезапно станет классом (вместо экземпляра класса), и кодер поедет крышей в процессе отладки, учитывая то, как фривольно питон взаимозаменяет класс и экземпляр — это не баг, это фича питона. Фича, вроде метаклассов, которых на самом деле нет и никогда не будет в питоне.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

Вроде больше ни в одном языке такой наркомании нет

в C++ есть. Но там и похлеще наркомания встречается...

Sahas ★★★★☆
()
Ответ на: комментарий от Sahas

в C++ есть. Но там и похлеще наркомания встречается...

Вот. Я тоже так подумал, а мог бы в нетфликсе каком-нибудь уже работать. Наркомания — это хорошо и полезно, потому что можно хорошо зарабатывать на вытирянии слюней конченным торчкам.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Я очень сильно сомневаюсь, что «DATASETS[‘AG_NEWS’]» — это именно функция, а не объект с переписанным call.

Конкретно в коде из ОП это все-таки функция (строки 145 и 377).

deadNightTiger ★★★★★
()
Ответ на: комментарий от anonymous

но позволяет «добавлять» его объектам, «превращая» их в функции :)

Sahas ★★★★☆
()
Ответ на: комментарий от byko3y

для этого нужно в коде добавить базовый класс с методом request

так что все в руках Аллаха.

zudwa
()
Ответ на: комментарий от Sahas

Ладно, я просто тупака запостил немного. А вообще, у питона и крестов сходств гораздо больше, чем отличий

anonymous
()
Ответ на: комментарий от anonymous

() -> operator(): норм. () -> call: кал как он есть

Это справедливое замечание. Как бы стронно это не звучало, но я заявлю: питон — это сложный язык. Программы на нем, может быть, и просты, а язык сложен. И наоборот, какой-нибудь лисп прост как три копейки, но разобраться в программе может быть тяжеловато. Причина заключается в том, что схожие вещи реализованы по разному, крупные исторические пласты разрослись горизонтально и вертикально, образуя порой бессмысленные узоры. Например, методы с подчеркиваниями не подчиняются логике, вы можете только запомнить каждый из них, вы можете смотреть в доки, но вы не можете взглянув на малознакомый метод сказать «он нужен для того-то».

Процесс скатывания до такого состояния вы можете воочию увидеть в PEP, типа «какое там у нас слово еще не используется?» Нет, у нас не конкретные свойства-дескрипторы, а мы просто докинем в огромную кучу методов с подчеркиванием еще горстку подобных. В итоге имеем __getattr__, __getattribute__, __get__, __getitem__ — причем, все они служат примерно одной и той же цели, но каждая имеет свои причуды.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

питон — это сложный язык

какой-нибудь лисп прост как три копейки

Я и говорю, кресты и питон похожи больше, чем отличаются:

  • либо тысячи костылей для частных случаев и клеймо переусложнённое/неочевидное/whatever
  • либо всего несколько базовых правил(из которых все остальные выводятся без неоднозначностей) и невзлетевший язык
anonymous
()
Ответ на: комментарий от byko3y

Причина заключается в том, что схожие вещи реализованы по разному

a = [False, True][b not in c]
a = True if b not in c else False
a = b not in c
anonymous
()
Ответ на: комментарий от anonymous

Причина заключается в том, что схожие вещи реализованы по разному

a = [False, True][b not in c]
a = True if b not in c else False
a = b not in c

Есть разные безумные однострочники на разных языках, но здесь по сути задача выполняется.... функцией «not in». Почему не «not b in c», почему не «b in not c», при том, что «b is not c» — одному аллаху известно. Я понимаю, что так принято в английском языке строить фразы, но также я понимаю, что ты не на английском языке программы писать будешь. И получается, что отдала девственность за коробку конфет.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

либо тысячи костылей для частных случаев и клеймо переусложнённое/неочевидное/whatever
либо всего несколько базовых правил(из которых все остальные выводятся без неоднозначностей) и невзлетевший язык

Твое правило вполне оправдано в плане того, что интенсивно используемая система неизбежно будет обрастать слоями совместимости, отсюда частные случаи/переусложнонности, но ты упускаешь из виду есть оправданные преусложнения, а есть неоправданные. Можно костылить Криштиану Роналдо под новые профессии, а можно костылить слепого с рождения калеку. И в итоге индустрия выбирает того, что «ну он такой миленький, когда ничего не видит, мне его жалко».

byko3y ★★★★
()

Вот потому и надо IDE использовать умную. Чтобы уметь переходить к объявлению, определению и так далее.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Проблема в том, что для Python нет умных IDE из-за динамической типизации. Сейчас они, конечно, пытаются реализовать костыльные тайп-хинты нашлёпкой сбоку языка, чтобы получить хоть какое-то преимущество языков белых людей, но что-то оно у них не заходит толком. IDE как обсирались на авто-дополнении без Type-hint’ов, так и продолжают обсираться уже и с ними.

EXL ★★★★★
()
Ответ на: комментарий от dvetutnev

К чему твой высер, лицо с лишней хромосомой?

anonymous
()
Ответ на: комментарий от byko3y

Что хотели сделать разрабы записью «DATASETS['AG_NEWS'](root='./.data', ngrams=NGRAMS, vocab=None)»? Ну типа нужно сделать запрос из набора данных по определенным параметрам.

даже по одной строчке понятно, что это такой обычный и частоприменяемый питонячий фабричный метод

вопрос в другом, почему ТС полез в самые недры на самый низ, вместо того чтобы пользоваться этим через нормальный интерфейс.

n_play
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.