Если у вас еще нет массива на map()
, например, ответа @ FakeRainBrigand, и хотите вставить его таким образом, чтобы исходный макет соответствовал выходному сигналу ближе, чем ответ @ SophieAlpert:
http://plnkr.co/edit/mfqFWODVy8dKQQOkIEGV?p=preview
{[...Array(10)].map((x, i) =>
)}
Re: указывает, что Array.from
требуется для распространения, но в настоящее время (v5.8.23
), который, похоже, не имеет места при распространении фактического Array
. У меня есть проблема документации , чтобы выяснить это. Но используйте на свой страх и риск или полипол.
Array.apply
{Array.apply(0, Array(10)).map(function (x, i) {
return ;
})}
http://plnkr.co/edit/4kQjdTzd4w69g8Suu2hT?p=preview
{(function (rows, i, len) {
while (++i <= len) {
rows.push( )
}
return rows;
})([], 0, 10)}
Хранить исходный макет, соответствующий выходному , но сделайте внутреннюю часть более компактной:
render: function () {
var rows = [], i = 0, len = 10;
while (++i <= len) rows.push(i);
return (
{rows.map(function (i) {
return ;
})}
);
}
Array
методы С помощью Array.prototype.fill
вы могли бы сделать это как альтернативу использованию спреда, как показано выше:
{Array(10).fill(1).map((el, i) =>
)}
(я думаю, вы действительно могли бы опустить любой аргумент fill()
, но я не на это 100%.) Благодаря @FakeRainBrigand для исправления моей ошибки в более ранней версии решения fill()
(см. ревизии).
key
Во всех случаях key
attr устраняет предупреждение с помощью сборки разработки, но недоступно для ребенка. Вы можете передать дополнительный attr, если хотите, чтобы индекс был доступен в дочернем элементе. См. Списки и ключи для обсуждения.
Мне нравится использовать locate
, который работает со встроенными типами:
>>> from pydoc import locate
>>> locate('int')
<type 'int'>
>>> t = locate('int')
>>> t('1')
1
... а также все, что он может найти в пути:
>>> locate('datetime.date')
<type 'datetime.date'>
>>> d = locate('datetime.date')
>>> d(2015, 4, 23)
datetime.date(2015, 4, 23)
... включая ваши пользовательские типы:
>>> locate('mypackage.model.base.BaseModel')
<class 'mypackage.model.base.BaseModel'>
>>> m = locate('mypackage.model.base.BaseModel')
>>> m()
<mypackage.model.base.BaseModel object at 0x1099f6c10>
Вы немного смущены тем, что вы пытаетесь сделать. Типы, также известные как классы, являются объектами, как и все остальное в python. Когда вы пишете int
в своих программах, вы ссылаетесь на глобальную переменную, называемую int
, которая оказывается классом. То, что вы пытаетесь сделать, это не «лить строку для ввода», она обращается к встроенным переменным по имени.
Как только вы это понимаете, решение легко увидеть:
def get_builtin(name):
return getattr(__builtins__, name)
Если вы действительно хотели превратить имя типа в типа, вот как вы это сделаете. Я использую deque
, чтобы выполнить обход дерева без рекурсии.
def gettype(name):
from collections import deque
# q is short for "queue", here
q = deque([object])
while q:
t = q.popleft()
if t.__name__ == name:
return t
else:
print 'not', t
try:
# Keep looking!
q.extend(t.__subclasses__())
except TypeError:
# type.__subclasses__ needs an argument, for whatever reason.
if t is type:
continue
else:
raise
else:
raise ValueError('No such type: %r' % name)
Почему бы просто не использовать справочную таблицу?
known_types = {
'int': int,
'float': float,
'str': str
# etc
}
var_type = known_types['int']
Возможно, это то, что вы хотите, оно смотрит только на встроенные типы:
def gettype(name):
t = getattr(__builtins__, name)
if isinstance(t, type):
return t
raise ValueError(name)