'Модуль импорта' лучший стиль кодирования, чем 'от функции импорта модуля'?

Слишком плохо это не Oracle, или иначе Вы могли использовать trunc () или to_char ().

, Но я имел подобные проблемы с SQL Server и использовал ПРЕОБРАЗОВАНИЕ () и DateDiff () методы, как ссылается здесь

67
задан Community 23 May 2017 в 12:10
поделиться

3 ответа

Негативы, которые вы перечисляете для IM / FPIM, часто могут быть улучшены соответствующим использованием предложения как . from some.package import mymodulewithalongname as mymod может с пользой сократить ваш код и улучшить его читаемость, а если вы переименуете mymodulewithalongname в что-то совершенно другое завтра, как Предложение можно использовать как единый оператор для редактирования.

Рассмотрим точку 3 про-FMIF (назовем ее R для перенаправления) и точку 2 про-FPIM (назовем ее F для гибкости): R означает облегчение потеря целостности границ модуля, а F усиливает ее. Несколько функций, классов и переменных в модуле часто предназначены для совместной работы: они не должны независимо переключаться на разные значения. Например, рассмотрим модуль random и его функции seed и uniform : если бы вы переключили импорт только одного из них на другой модуль, вы бы нарушили нормальная связь между вызовами seed и результатами вызовов uniform . Когда модуль хорошо спроектирован, сплочен и целостен, содействие R в разрушении границ модуля на самом деле является негативным - это облегчает выполнение того, что вам лучше не делать.

И наоборот, F - это то, что обеспечивает скоординированное переключение связанных функций, классов и переменных (так, как правило, сущностей, которые принадлежат вместе по модульности). Например, чтобы сделать тестирование повторяемым (пункт 1 FPIM), вы имитируете оба seed и random в модуле random , и если ваш код соответствует FPIM, все готово, координация гарантирована; но если у вас есть код, который импортировал функции напрямую, вам придется выслеживать каждый такой модуль и повторять насмешку снова и снова. Для обеспечения идеальной повторяемости тестов обычно также требуется "скоординированное имитация" функций даты и времени - если вы используете from datetime import datetime в некоторых модулях, вам нужно найти и имитировать их все (а также всех, кто делает from time import time и т. Д.), Чтобы гарантировать, что все времена получены, когда различные части системы спрашивают: «Так сколько сейчас времени?» полностью согласованы (если вы используете FPIM, вы просто имитируете два соответствующих модуля).

Мне нравится FPIM, потому что использование квалифицированного имени multiply , а не однозначного имени (в то время как разница между пустыми именами и квалифицированными именами огромна - - вы получаете , так что гораздо больше контроля с квалифицированным именем, будь то одиночное или многократное, чем вы, возможно, когда-либо могли бы с голым именем!).

Ах, ну, не могу посвятить весь рабочий день ответить на каждый из ваших пунктов - ваш вопрос, вероятно, должен быть полдюжины вопросов ;-). Я надеюсь, что это, по крайней мере, решает вопрос «почему F лучше R» и некоторые из проблем с издевательством / тестированием - это сводится к сохранению и усилению хорошо спроектированной модульности (через F), а не к ее подрыву ( через R).

На самом деле не так много пользы от использования квалифицированного имени умножить , а не однозначного имени (в то время как разница между начальными именами и квалифицированными именами огромна - вы получаете так гораздо больше контроля с квалифицированным именем, будь то одиночное или многократное, чем вы, возможно, когда-либо могли бы с голым именем!).

Ну что ж, не могу посвятить весь рабочий день ответам на каждое из ваши баллы - вероятно, ваш вопрос должен состоять из полдюжины вопросов ;-). Я надеюсь, что это, по крайней мере, решает вопрос «почему F лучше R» и некоторые из проблем с издевательством / тестированием - это сводится к сохранению и усилению хорошо спроектированной модульности (через F), а не к ее подрыву ( через R).

На самом деле не так много пользы от использования квалифицированного имени умножить , а не однозначного имени (в то время как разница между начальными именами и квалифицированными именами огромна - вы получаете так гораздо больше контроля с квалифицированным именем, будь то одиночное или многократное, чем вы, возможно, когда-либо могли бы с голым именем!).

Ну что ж, не могу посвятить весь рабочий день ответам на каждое из ваши баллы - вероятно, ваш вопрос должен состоять из полдюжины вопросов ;-). Я надеюсь, что это, по крайней мере, решает вопрос «почему F лучше R» и некоторые из проблем с издевательством / тестированием - это сводится к сохранению и усилению хорошо спроектированной модульности (через F), а не к ее подрыву ( через R).

Посвятите весь рабочий день ответам на каждый из ваших пунктов - ваш вопрос, вероятно, должен состоять из полдюжины вопросов ;-). Я надеюсь, что это, по крайней мере, решает вопрос «почему F лучше R» и некоторые из проблем с издевательством / тестированием - это сводится к сохранению и усилению хорошо спроектированной модульности (через F), а не к ее подрыву ( через R).

Посвятите весь рабочий день ответам на каждый из ваших пунктов - ваш вопрос, вероятно, должен состоять из полдюжины вопросов ;-). Я надеюсь, что это, по крайней мере, решает вопрос «почему F лучше R» и некоторые из проблем с издевательством / тестированием - это сводится к сохранению и усилению хорошо спроектированной модульности (через F), а не к ее подрыву ( через R).

45
ответ дан 24 November 2019 в 14:43
поделиться

Классический текст об этом, как часто бывает, принадлежит Фредрику. Лунд, тупица. Его совет: всегда используйте import - кроме случаев, когда вы не должны.

Другими словами, будьте разумны. Лично я считаю, что все, что содержит несколько модулей, обычно импортируется через из xyz import a - основным примером являются модели Django. Но, как и все остальное, это вопрос стиля, и он должен быть последовательным, особенно с такими модулями, как datetime , где и модуль, и класс, который он содержит, называются одинаково. Вам нужно написать datetime.datetime.now () или просто datetime.now () ? (В моем коде всегда первое. )

Пункты 1 и 2 в вашем списке вопросов кажутся одной и той же проблемой. Динамический характер Python означает, что заменить элемент в пространстве имен модуля довольно просто, независимо от того, какой из методов вы используете. Сложность возникает, если одна функция в модуле ссылается на другую, которую вы хотите имитировать. В этом случае импорт модуля, а не функций означает, что вы можете выполнить module.function_to_replace = myreplacementfunc , и все будет работать прозрачно, но это так же легко сделать через FPIM, как и через IM.

I также не понимаю, как пункт 3 имеет какое-либо отношение к чему-либо. Однако я думаю, что ваш пункт 4 основан на некотором недоразумении. Ни один из предложенных вами методов не «загрязнит ваше пространство имен». Что делает , так это из импорта модуля * , где вы вообще не знаете, что импортируете, и поэтому функции могут появляться в вашем коде без подсказки читателю, откуда они пришли. Это ужасно, и этого следует избегать любой ценой.

17
ответ дан 24 November 2019 в 14:43
поделиться

Как и Алекс Мартелли, я люблю использовать как при импорте функции.

Я сделал еще один префикс для всех функций, которые были импортировано из того же модуля:

from random import seed as r_seed
from random import random as r_random

r_seed короче по типу, чем random.seed , но в некоторой степени сохраняет границы модуля. Кто-то, случайно взглянув на ваш код, может увидеть r_seed () и r_random () и получить возможность понять, что они связаны.

Конечно, вы всегда можете просто сделать:

import random as r

, а затем используйте r.random () и r.seed () , что может быть идеальным компромиссом для этого случая. Я использую трюк с префиксом только при импорте одной или двух функций из модуля. Если я хочу использовать много функций из одного модуля, я импортирую модуль,

6
ответ дан 24 November 2019 в 14:43
поделиться
Другие вопросы по тегам:

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