Преобразование строки в другие типы динамически в Python [duplicate]

Если у вас еще нет массива на map(), например, ответа @ FakeRainBrigand, и хотите вставить его таким образом, чтобы исходный макет соответствовал выходному сигналу ближе, чем ответ @ SophieAlpert:

С ES2015 ( ES6) [расширенные и стрелочные функции]

http://plnkr.co/edit/mfqFWODVy8dKQQOkIEGV?p=preview


  {[...Array(10)].map((x, i) =>
    
  )}

Re: указывает, что Array.from требуется для распространения, но в настоящее время (v5.8.23), который, похоже, не имеет места при распространении фактического Array. У меня есть проблема документации , чтобы выяснить это. Но используйте на свой страх и риск или полипол.

Vanilla ES5

Array.apply


  {Array.apply(0, Array(10)).map(function (x, i) {
    return ;
  })}

Inline IIFE

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 ;
      })}
    
  );
}

С синтаксисом ES2015 & amp; Array методы

С помощью Array.prototype.fill вы могли бы сделать это как альтернативу использованию спреда, как показано выше:


  {Array(10).fill(1).map((el, i) =>
    
  )}

(я думаю, вы действительно могли бы опустить любой аргумент fill(), но я не на это 100%.) Благодаря @FakeRainBrigand для исправления моей ошибки в более ранней версии решения fill() (см. ревизии).

key

Во всех случаях key attr устраняет предупреждение с помощью сборки разработки, но недоступно для ребенка. Вы можете передать дополнительный attr, если хотите, чтобы индекс был доступен в дочернем элементе. См. Списки и ключи для обсуждения.

13
задан Morwenn 13 August 2012 в 12:38
поделиться

4 ответа

Мне нравится использовать 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>
18
ответ дан dannymac 24 August 2018 в 07:21
поделиться

Вы немного смущены тем, что вы пытаетесь сделать. Типы, также известные как классы, являются объектами, как и все остальное в 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)
4
ответ дан bukzor 24 August 2018 в 07:21
поделиться

Почему бы просто не использовать справочную таблицу?

known_types = {
    'int': int,
    'float': float,
    'str': str
    # etc
}

var_type = known_types['int']
4
ответ дан Hugh Bothwell 24 August 2018 в 07:21
поделиться

Возможно, это то, что вы хотите, оно смотрит только на встроенные типы:

def gettype(name):
    t = getattr(__builtins__, name)
    if isinstance(t, type):
        return t
    raise ValueError(name)
2
ответ дан Janne Karila 24 August 2018 в 07:21
поделиться
Другие вопросы по тегам:

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