Можно идею развить и задуматься над тем, чтобы, например, этот кастомный формат корректно сохранять в SQL и потом читать. Существенное отличие предложенного вами формата в том, что он не содержит долей секунд и таймзоны.
Для работы с SQL можем реализовать интерфейс sql.Scanner, чтобы обычная сохранённая дата, даже с долями секунд и таймзоной, интерпретировалась в нужный формат:
Ну судя по тексту, пока беспилотник не взлетел — к нему нет никаких вопросов.
Из собственного опыта — без каких-либо вопросов возил свой Мавик в Израиль. Да и у нас на Красной Поляне удалось полетать, правда, один раз на Роза-Пике застукали, но всего лишь попросили без разрешения не летать, так как граница рядом.
В описании функции не допускается многократное использование позиционных и именованных аргументов, то есть такое описание функции, как printScores(student, *scores, *otherData), или же printScores(student, **kwargs, **other_kwargs) недопустимо — интерпретатор упадёт с ошибкой «invalid syntax». Оно и понятно — если более одного набора позиционных или именованных аргументов — нет возможности однозначно поделить аргументы между ними.
Позиционные аргументы приходят в виде кортежа (tuple), который как раз определяется звёздочкой, именованные аргументы приходят в виде словаря dict, и двойная звёздочка тут есть именно задание словаря. То есть при описании функции звёздочки это не операторы, выполняющие какое-либо действие, а именно описание параметров функции, так для printScores(student, *args, **kwargs) мы указываем, что внутри функции мы будем работать с кортежем args и словарём kwargs, по которым будут «разбросаны» все позиционные и именованные аргументы вызова функции. И чтобы не было путаницы, в вызове сначала указываются позиционные параметры (попадают в кортеж args с сохранением последовательности), а потом именованные, то есть вызов printScores('name', param='value', 42) недопустим.
При вызове printScores('name', [1,2,3]) в scores будет кортеж ([1,2,3]), ну или, если кортеж преобразовать в список, то будет список: list(scores) = [[1,2,3]]
Для работы с SQL можем реализовать интерфейс sql.Scanner, чтобы обычная сохранённая дата, даже с долями секунд и таймзоной, интерпретировалась в нужный формат:
И интерфейс driver.Valuer:
Ну и для красивого вывода в строках (не только в JSON) — интерфейс fmt.Stringer:
Из собственного опыта — без каких-либо вопросов возил свой Мавик в Израиль. Да и у нас на Красной Поляне удалось полетать, правда, один раз на Роза-Пике застукали, но всего лишь попросили без разрешения не летать, так как граница рядом.
Позиционные аргументы приходят в виде кортежа (tuple), который как раз определяется звёздочкой, именованные аргументы приходят в виде словаря dict, и двойная звёздочка тут есть именно задание словаря. То есть при описании функции звёздочки это не операторы, выполняющие какое-либо действие, а именно описание параметров функции, так для printScores(student, *args, **kwargs) мы указываем, что внутри функции мы будем работать с кортежем args и словарём kwargs, по которым будут «разбросаны» все позиционные и именованные аргументы вызова функции. И чтобы не было путаницы, в вызове сначала указываются позиционные параметры (попадают в кортеж args с сохранением последовательности), а потом именованные, то есть вызов printScores('name', param='value', 42) недопустим.
При вызове printScores('name', [1,2,3]) в scores будет кортеж ([1,2,3]), ну или, если кортеж преобразовать в список, то будет список: list(scores) = [[1,2,3]]