Я не думаю, что это была бы хорошая идея записать реальный почтовый сервер в Python. Это, конечно, возможно (см. сообщения mcrute и Manuel Ceron для имения деталей), но это - большая работа при размышлении обо всем, что реальный почтовый сервер должен обработать (организация очередей, повторная передача, контакт со спамом, и т.д.).
необходимо объяснить более подробно, в чем Вы нуждаетесь. Если бы Вы просто хотите реагировать на входящую электронную почту, я предложил бы настроить почтовый сервер для вызова программы, когда это получает электронное письмо. Эта программа могла сделать то, что она хочет (обновление базы данных, создавая файл, говоря с другой программой Python).
Для вызова произвольной программы от почтового сервера у Вас есть несколько вариантов:
~/.forward
содержащий "|/path/to/program"
|path/to/program
object_getInstanceVariable
- это маленькая запутанная функция. задокументировано , что последним параметром является параметр void **
, то есть вы передаете адрес переменной void *
и получаете указатель на переменная экземпляра - но она реализована так, как если бы она была параметром void *
, то есть вы передаете адрес переменной, копию которой вы хотите сохранить. Проблема в том, что реализация игнорирует размер переменной экземпляра и просто копирует указатель. Так что все, что имеет размер указателя, будет работать идеально. Если вы работаете с 32-битной архитектурой, будут скопированы только старшие 32 бита. (Вы должны наблюдать такое же поведение с переменной экземпляра long long
. )
Решение состоит в том, чтобы использовать основной API, кодирование значения ключа , используя -valueForKey:
.
Другое решение: если вы хотите написать фиксированную версию , скажем, в качестве категории для NSObject он будет выглядеть примерно так:
@implementation NSObject (InstanceVariableForKey)
- (void *)instanceVariableForKey:(NSString *)aKey {
if (aKey) {
Ivar ivar = object_getInstanceVariable(self, [aKey UTF8String], NULL);
if (ivar) {
return (void *)((char *)self + ivar_getOffset(ivar));
}
}
return NULL;
}
@end
Тогда ваш код будет выглядеть так:
double myDoubleValue = *(double *)[self instanceVariableForKey:@"someDouble"];
А как насчет использования valueForKey:?
NSNumber * value = [self valueForKey:[NSString stringWithUTF8String:ivar_getName(tmpIvar)]];
NSLog(@"Double value: %f", [value doubleValue];
Примечание: для этого у вас должен быть метод someFloat. Если вы хотите использовать setValue: forKey :, вам также понадобится метод setSomeFloat :. Это легко реализовать, объявив ivar как @property и синтезируя его.