Вызов типов через их имя как строка в Python

Текущий статус (Моно 2.10, 2011): xbuild теперь в состоянии создать все версии Visual Studio / проекты MSBuild, включая .sln файлы. Просто выполненный xbuild так же, как Вы выполнились бы msbuild на Microsoft.Net Платформа. Вы не должны Моноразрабатывать установленный, xbuild идет со стандартной Моно установкой.

, Если Ваша сборка использует пользовательские задачи, они должны все еще работать, если они не зависят от исполняемых файлов Windows (такой как rmdir или xcopy).

при редактировании файлов проекта используйте стандартный синтаксис пути Windows - они будут преобразованы xbuild при необходимости. Один важный протест к этому правилу является чувствительностью к регистру - не смешивают различную оболочку того же имени файла. Если у Вас есть проект, который делает это, можно включить режим эмуляции путем вызова MONO_IOMAP=case xbuild foo.sln (или попытка MONO_IOMAP=all). Моно имеет страницу, описывающую более усовершенствованный проект MSBuild портирование методы.

Моно 2,0 ответа (2008): xbuild еще не завершен (это работает вполне хорошо с файлами VS2005 .csproj, имеет проблемы с VS2008 .csproj и не обрабатывает .sln). Моно 2,1 плана объединить кодовую базу mdtool (механизм сборки командной строки MonoDevelop) в него, но в настоящее время mdtool является лучшим выбором. mdtool build -f:project.sln или man mdtool , если Вам установили MonoDevelop.

5
задан Community 23 May 2017 в 12:30
поделиться

6 ответов

Есть локальные переменные, глобальные переменные и встроенные. Возможно, вы ищете встроенную команду:

import __builtin__
getattr(__builtin__,'int')
12
ответ дан 18 December 2019 в 06:03
поделиться

Вы уже получили решение, использующее встроенные команды, но еще один полезный прием, который стоит держать в своем наборе инструментов, - это таблица диспетчеризации. Если ваш CSV-файл предназначен для использования несколькими приложениями, написанными на нескольких языках, он может выглядеть так:

Integer,15
String,34
Float,1.0
Integer,8

В таком случае вам может потребоваться что-то вроде этого, где csv - это список кортежей, содержащих данные выше:

mapping = {
    'Integer': int,
    'String': str,
    'Float': float,
    'Unicode': unicode
}
results = []
for row in csv:
    datatype = row[0]
    val_string = row[1]
    results.append(mapping[datatype](val_string))
return results

Это дает вам гибкость, позволяя отображать произвольные строки в полезные типы. Вам не нужно массировать данные, чтобы получить точные значения, которые ожидает Python.

7
ответ дан 18 December 2019 в 06:03
поделиться
getattr(__builtins__,'int')
3
ответ дан 18 December 2019 в 06:03
поделиться

Если у вас есть строка, которая представляет собой имя объекта, и вы хотите получить эту вещь, вы также можете использовать:

thing = 'int'
eval(thing)

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

1
ответ дан 18 December 2019 в 06:03
поделиться

Проблема в том, что int является частью модуля __ builtins __ , а не просто частью глобального пространства имен. Вы можете получить встроенный тип, такой как int , используя следующий бит кода:

int_gen = getattr(globals()["__builtins__"], "int")
i = int_gen(4)
# >>> i = 4

Точно так же вы можете получить доступ к любому другому (импортированному) модулю, передав имя модуля в виде строкового индекса в globals () , а затем с помощью getattr для извлечения требуемых атрибутов.

2
ответ дан 18 December 2019 в 06:03
поделиться

Комментарии предполагают, что вы недовольны идеей использования eval для генерации данных. поиск функции в __ builtins __ позволяет найти eval .

самое простое решение выглядит так:

import __builtin__

def parseInput(typename, value):
    return getattr(__builtins__,typename)(value)

Вы бы использовали его так:

>>> parseInput("int", "123")
123

круто. работает нормально. а как насчет этого?

>>> parseInput("eval", 'eval(compile("print \'Code injection?\'","","single"))')
Code injection?

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

import __builtin__

def parseInput(typename, value):
    return {"int":int, "float":float, "str":str}[typename](value)

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

import __builtin__

def parseInput(typename, value):
    typector = getattr(__builtins__,typename)
    if type(typector) is type:
        return typector(value)
    else:
        return None
2
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

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