у вас есть 2 варианта:
x
вместе с d
Изменение входного аргумента может укусить Вы позже, когда вы хотите проверить оригинальную версию x
или что-то уже имеет ссылку на оригинал, и вы изменили его.
Я бы предложил это (измените итерационную переменную в понимании, есть другие буквы там, используйте их):
def compress_vector(x):
assert type(x) is list
x = [x for value in x if value]
d = {'inds': [v for v, k in enumerate(x)], 'vals': x}
return x,d
затем:
x,d = compress_vector(x)
Чтобы изменить [116 ] использование на месте назначение среза , которое не создает новую ссылку, но использует исходную ссылку:
def compress_vector(x):
assert type(x) is list
x[:] = [x for value in x if value]
return {'inds': [v for v, k in enumerate(x)], 'vals': x}
Ваш вопрос не очень конкретен. Если Вы обновите его с большей информацией, то я изложу в деталях этот ответ с дополнительной деталью.
Вот обзор ручных включенных шагов.
TypeAttributes.Interface
сделать Ваш тип интерфейсом.TypeBuilder.CreateType
закончить создавать Ваш интерфейс.Для динамического создания сборки с интерфейсом, имеющим атрибуты:
using System.Reflection;
using System.Reflection.Emit;
// Need the output the assembly to a specific directory
string outputdir = "F:\\tmp\\";
string fname = "Hello.World.dll";
// Define the assembly name
AssemblyName bAssemblyName = new AssemblyName();
bAssemblyName.Name = "Hello.World";
bAssemblyName.Version = new system.Version(1,2,3,4);
// Define the new assembly and module
AssemblyBuilder bAssembly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(bAssemblyName, AssemblyBuilderAccess.Save, outputdir);
ModuleBuilder bModule = bAssembly.DefineDynamicModule(fname, true);
TypeBuilder tInterface = bModule.DefineType("IFoo", TypeAttributes.Interface | TypeAttributes.Public);
ConstructorInfo con = typeof(FunAttribute).GetConstructor(new Type[] { typeof(string) });
CustomAttributeBuilder cab = new CustomAttributeBuilder(con, new object[] { "Hello" });
tInterface.SetCustomAttribute(cab);
Type tInt = tInterface.CreateType();
bAssembly.Save(fname);
, который создает следующее:
namespace Hello.World
{
[Fun("Hello")]
public interface IFoo
{}
}
При добавлении методов используется класс MethodBuilder, вызывая TypeBuilder.DefineMethod.