Слишком плохо это не Oracle, или иначе Вы могли использовать trunc () или to_char ().
, Но я имел подобные проблемы с SQL Server и использовал ПРЕОБРАЗОВАНИЕ () и DateDiff () методы, как ссылается здесь
Негативы, которые вы перечисляете для 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).Классический текст об этом, как часто бывает, принадлежит Фредрику. Лунд, тупица. Его совет: всегда используйте import - кроме случаев, когда вы не должны.
Другими словами, будьте разумны. Лично я считаю, что все, что содержит несколько модулей, обычно импортируется через из xyz import a
- основным примером являются модели Django. Но, как и все остальное, это вопрос стиля, и он должен быть последовательным, особенно с такими модулями, как datetime
, где и модуль, и класс, который он содержит, называются одинаково. Вам нужно написать datetime.datetime.now ()
или просто datetime.now ()
? (В моем коде всегда первое. )
Пункты 1 и 2 в вашем списке вопросов кажутся одной и той же проблемой. Динамический характер Python означает, что заменить элемент в пространстве имен модуля довольно просто, независимо от того, какой из методов вы используете. Сложность возникает, если одна функция в модуле ссылается на другую, которую вы хотите имитировать. В этом случае импорт модуля, а не функций означает, что вы можете выполнить module.function_to_replace = myreplacementfunc
, и все будет работать прозрачно, но это так же легко сделать через FPIM, как и через IM.
I также не понимаю, как пункт 3 имеет какое-либо отношение к чему-либо. Однако я думаю, что ваш пункт 4 основан на некотором недоразумении. Ни один из предложенных вами методов не «загрязнит ваше пространство имен». Что делает , так это из импорта модуля *
, где вы вообще не знаете, что импортируете, и поэтому функции могут появляться в вашем коде без подсказки читателю, откуда они пришли. Это ужасно, и этого следует избегать любой ценой.
Как и Алекс Мартелли, я люблю использовать как
при импорте функции.
Я сделал еще один префикс для всех функций, которые были импортировано из того же модуля:
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 ()
, что может быть идеальным компромиссом для этого случая. Я использую трюк с префиксом только при импорте одной или двух функций из модуля. Если я хочу использовать много функций из одного модуля, я импортирую модуль,