Относительный импорт происходит всякий раз, когда вы импортируете пакет относительно текущего скрипта / пакета.
Рассмотрим следующее дерево, например:
mypkg
├── base.py
└── derived.py
Теперь ваш derived.py
требует что-то из base.py
. В Python 2 вы можете сделать это так (в derived.py
):
from base import BaseThing
Python 3 больше не поддерживает это, поскольку он не является явным, хотите ли вы «относительного» или «абсолютного» base
. Другими словами, если в системе был установлен пакет Python с именем base
, вы бы ошибались.
Вместо этого он требует, чтобы вы использовали явный импорт , который явно указать расположение модуля на основе пути. Ваш derived.py
будет выглядеть так:
from .base import BaseThing
Ведущий .
говорит «import base
из каталога модуля»; Другими словами, .base
отображается на ./base.py
.
Аналогичным образом существует префикс ..
, который поднимается вверх по иерархии каталогов, такой как ../
(с ..mod
отображением на ../mod.py
), и затем ...
, который идет на два уровня вверх (../../mod.py
) и т. д.
Пожалуйста, обратите внимание, что относительные пути, перечисленные выше, относились к каталогу, в котором находится текущий модуль (derived.py
), не текущий рабочий каталог.
@BrenBarn уже объяснил случай импорта звезды. Для полноты, я должен будет сказать то же самое;).
Например, вам нужно использовать несколько функций math
, но вы используете их только в одной функции. В Python 2 вам разрешили быть полу-ленивым:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Обратите внимание, что он уже запускает предупреждение в Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
В современном коде Python 2 вы должны и в Python 3 вы должны сделать либо:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
, либо:
from math import *
def sin_degrees(x):
return sin(degrees(x))
Значение интерпретируется как число. Вы можете сравнить параметры времени в атрибуте disabled с помощью строки:
<mat-option [disabled]="time2.toString() === timeSelection1.toString()" *ngFor="
let time2 of resTimePeriodData
" [value]="time2">{{ time2 }}</mat-option>
Я бы порекомендовал использовать только цифры.
Я бы сделал что-то вроде этого:
HTML:
<div class="row">
<div class="col-md-2 ">
<!-- DROP DOWN FOR CURRENT TIME PERIOD -->
<mat-form-field>
<mat-select [(value)]="selected" placeholder="Current Time Period" multiple name="select1" [(ngModel)]="timeSelection1">
<mat-option *ngFor="let time1 of resTimePeriodData" [value]="time1">{{ time1 }}</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
<div class="row">
<div class="col-md-2">
<mat-form-field>
<!-- DROP DOWN FOR PREVIOUS TIME PERIOD -->
<mat-select placeholder="Previous Time Period" multiple name="select2" [(ngModel)]="timeSelection2">
<mat-option *ngFor="let time2 of resTimePeriodData" [value]="time2" [disabled]="isDisable(time2)">{{ time2 }}</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
TS:
isDisable(obj) {
var index = this.selected.indexOf(obj);
if (index == -1) {
return false;
}
else {
return true;
}
}
Вы также можете попробовать улучшить существующий код! [117 ]