Лучшая практика для вложенных модулей модуля Python с * [duplicate]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

1
задан Peter Mortensen 19 February 2011 в 13:42
поделиться

4 ответа

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

Импортирование модуля, скажем moda, из многих модулей (например, modb, modc, modd, ...), которые нуждаются в одном или больше идентификаторов moda определяет, не замедляет работу: байт-код moda загружается (и, возможно, из его источников, если необходимо) только один раз, первый раз moda импортируется в любом месте, тогда все остальные Импорт модуля использует быстрый путь, включающий кэш (имена модулей отображения dict для объектов модуля, которые доступны в качестве sys.modules в случае необходимости ... если вы сначала import sys, конечно! -).

9
ответ дан Alex Martelli 4 September 2018 в 10:36
поделиться

Python автоматически не вводит ничего в пространство имен myfile.py, но вы можете получить доступ ко всему, что находится в пространствах имен всех других модулей.

То есть, если в файле file1.py вы выполнили from file2 import SomeClass, а в myfile.py вы сделали import file1, вы можете получить к нему доступ в myfile как file1.SomeClass. Если в файле file1.py вы выполнили import file2, а в файле myfile.py вы выполнили import file1, вы можете получить доступ к классу из myfile как file1.file2.SomeClass. (Это, как правило, не лучшие способы сделать это, особенно не второй пример.)

Это легко проверить.

1
ответ дан Mike Graham 4 September 2018 в 10:36
поделиться

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

0
ответ дан Peter Mortensen 4 September 2018 в 10:36
поделиться

В модуле myfile вы можете сделать from file import ClassFromFile2 или from file2 import ClassFromFile2 для доступа к ClassFromFile2, считая, что класс также импортирован в файл.

Этот метод часто используется для упрощения API a немного. Например, модуль db.py может импортировать различные вещи из модулей mysqldb, sqlalchemy и некоторых других помощников. Более того, все может быть доступно через модуль db.

0
ответ дан tux21b 4 September 2018 в 10:36
поделиться
Другие вопросы по тегам:

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